您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

PHP中的Traits详解

2025/10/1 5:07:32发布19次查看
原文链接:http://tabalt.net/blog/php-traits/
php是单继承的语言,在php 5.4 traits出现之前,php的类无法同时从两个基类继承属性或方法。php的traits和go语言的组合功能类似,通过在类中使用use关键字声明要组合的trait名称,而具体某个trait的声明使用trait关键词,trait不能直接实例化。具体用法请看下面的代码:
carname}\n; } } class person { public function eat() { echo eat\n; } } class student extends person { use drive; public function study() { echo study\n; } } $student = new student(); $student->study(); $student->eat(); $student->driving();
输出结果如下:
studyeatdriving trait
上面的例子中,student类通过继承person,有了eat方法,通过组合drive,有了driving方法和属性carname。
如果trait、基类和本类中都存在某个同名的属性或者方法,最终会保留哪一个呢?通过下面的代码测试一下:
hello(); $student->driving();
输出结果如下:
hello studentdriving from drive
因此得出结论:当方法或属性同名时,当前类中的方法会覆盖 trait的 方法,而 trait 的方法又覆盖了基类中的方法。
如果要组合多个trait,通过逗号分隔 trait名称:
use trait1, trait2;
如果多个trait中包含同名方法或者属性时,会怎样呢?答案是当组合的多个trait包含同名属性或者方法时,需要明确声明解决冲突,否则会产生一个致命错误。
hi();echo \n;$obj2 = new class2();$obj2->hello();$obj2->hi();$obj2->hei();$obj2->hehe();
输出结果如下:
trait2::hellotrait1::hitrait2::hellotrait1::hitrait2::hitrait1::hello
as关键词还有另外一个用途,那就是修改方法的访问控制:
hello(); # 报致命错误,因为hello方法被修改成受保护的 $obj2 = new class2(); $obj2->hello(); # 原来的hello方法仍然是公共的 $obj2->hi(); # 报致命错误,因为别名hi方法被修改成私有的
trait 也能组合trait,trait中支持抽象方法、静态属性及静态方法,测试代码如下:
sayhello();$obj->sayworld();echo $obj->getworld() . \n;helloworld::dosomething();$obj->inc();$obj->inc();
输出结果如下:
helloworldget worlddoing something12
原文链接:http://tabalt.net/blog/php-traits/
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product