php traits的作用是针对php这样的单继承语言设计的,旨在让开发者很方便的在不同继承体系的多个类之间公用一系列方法,以减少单继承带来的局限性。
traits是针对php这样的单继承语言设计的。旨在让开发者很方便的在不同继承体系的多个类之间公用一系列方法,以减少单继承带来的局限性。traits和class的结合,避免了多继承带来的一些列问题。
使用
首先看下官方文档给出的例子:
<?phptrait ezcreflectionreturninfo { function getreturntype() { /*1*/ } function getreturndescription() { /*2*/ }}class ezcreflectionmethod extends reflectionmethod { use ezcreflectionreturninfo; /* ... */}class ezcreflectionfunction extends reflectionfunction { use ezcreflectionreturninfo; /* ... */}?>
从上面的例子可以看出,特性集ezcreflectionreturninfo包含了两个方法:getreturntype和getreturndescription,而下面的两个子类分别继承自不同的父类,却可以通过use ezcreflectionreturninfo来复用这两个方法。简单方便。
相关学习推荐:php编程从入门到精通
注意事项
如果子类、父类、use的traits中存在重名方法,那么这三个方法的优先级为:子类 > tratis > 父类;
可以同时use多个traits,但不可use重名的traits;
如果use的多个traits中存在方法名冲突,可以使用指定某个方法来自于某个tratis。例如:
<?phptrait 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。
<?phptrait 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的作用有哪些?的详细内容。