您好,登录后才能下订单哦!
php中的traits有什么用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
简介
Traits是面向对象编程中使用的一种概念,它表示一组可用于扩展类功能的方法。Traits提供了一组实现行为的方法,并要求来实现一组参数化所提供行为的方法。对于对象间的通信(以及对象之间的共享),特性在面向对象的协议(接口)和mixin之间有所不同。界面可以通过方法签名来定义一个或多个行为,而特征通过完整的方法定义来定义行为:即,它包括方法的主体。相比之下,mixin包含完整的方法定义,并且还可以通过成员变量携带状态,而特征通常不会。
使用
首先看下官方文档给出的例子:
<?php trait ezcReflectionReturnInfo { function getReturnType() { /*1*/ } function getReturnDescription() { /*2*/ } } class ezcReflectionMethod extends ReflectionMethod { use ezcReflectionReturnInfo; /* ... */ } class ezcReflectionFunction extends ReflectionFunction { use ezcReflectionReturnInfo; /* ... */ } ?>
从上面的例子可以看出,特性集ezcReflectionReturnInfo
包含了两个方法:getReturnType
和getReturnDescription
,而下面的两个子类分别继承自不同的父类,却可以通过use ezcReflectionReturnInfo
来复用这两个方法。简单方便。
注意事项
如果子类、父类、use的traits中存在重名方法,那么这三个方法的优先级为:子类 > tratis > 父类;
可以同时use多个traits,但不可use重名的traits;
如果use的多个traits中存在方法名冲突,可以使用指定某个方法来自于某个tratis。例如:
<?php trait A { public function smallTalk() { echo 'a'; } public function bigTalk() { echo 'A'; } } trait B { public function smallTalk() { echo 'b'; } public function bigTalk() { echo 'B'; } } class Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; } }
方法可以使用as来设置别称,但只在该类有效。
class Aliased_Talker { use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; B::bigTalk as talk; } }
使用as的时候,还可以改变方法的可见性。
class MyClass2 { use HelloWorld { sayHello as private myPrivateHello; } }
traits可以嵌套,例如A可以use B。
<?php trait Hello { public function sayHello() { echo 'Hello '; } } trait World { public function sayWorld() { echo 'World!'; } } trait HelloWorld { use Hello, World; }
traits中可以定义abstract方法,同样的,use该traits的class,也需要实现这些abstract的方法;
traits中可以定义常规变量、静态的变量和方法;
关于php中的traits有什么用问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。