PHP特质
介绍
PHP不支持多重继承。特质的特征在某种程度上克服了这种局限性。它是代码重用的机制。特质的定义与类相似。但是,它不能直接实例化。取而代之的是,可以通过use关键字将特征的功能提供给类。因此,一个类可以利用特征中定义的方法,甚至可以覆盖它们。这是它可能继承的任何其他父类的补充。
特征也类似于接口。不同之处在于接口不提供其内部方法的定义,而必须通过实现类来完成。但是,Trait方法确实提供了定义,该定义可能会或不会被使用该特征的类所覆盖。
语法
<?php trait testtrait{ public function test1(){ //方法主体 } } //使用特质 class testclass{ use testtrait //班上其他成员 } ?>
示例
在以下代码中,在类中使用具有两个方法的特征来覆盖其中一个方法
示例
<?php //特质的定义 trait testtrait{ public function test1(){ echo "test1 method in trait\n"; } public function test2(){ echo "test2 method in trait\n"; } } //使用特质 class testclass{ use testtrait; public function test1(){ echo "test1 method overridden\n"; } } $obj=new testclass(); $obj->test1(); $obj->test2(); ?>
输出结果
输出如下-
test1 method overridden test2 method in trait
儿童班的特质
这是特质的主要优点。具有父级的类也可以使用特征,并且可以选择重写其方法。从而有效地实现了多重继承。下面给出了此功能的示例-
示例
<?php //特质的定义 trait testtrait{ public function test1(){ echo "test1 method in trait\n"; } } //父类 class parentclass{ public function test2(){ echo "test2 method in parent\n"; } } //使用特质 and 父类 class childclass extends parentclass{ use testtrait; public function test1(){ echo "parent method overridden\n"; } public function test2(){ echo "trait method overridden\n"; } } $obj=new childclass(); $obj->test1(); $obj->test2(); ?>
输出结果
上面的代码产生以下结果-
parent method overridden trait method overridden
界面特质
可以让一个类实现一个接口,扩展其他父类并同时使用trait
示例
<?php //特质的定义 trait mytrait{ public function test1(){ echo "test1 method in trait1\n"; } } class myclass{ public function test2(){ echo "test2 method in 父类\n"; } } interface myinterface{ public function test3(); } //使用特质 and 父类 class testclass extends myclass implements myinterface{ use mytrait; public function test3(){ echo "implementation of test3 method\n"; } } $obj=new testclass(); $obj->test1(); $obj->test2(); $obj->test3(); ?>
输出结果
这将产生以下输出-
test1 method in trait1 test2 method in 父类 implementation of test3 method
解决冲突
如果一个类使用具有共同方法的两个特征,则它们的冲突由范围解析运算符和而不是关键字解决
示例
<?php trait trait1{ public function test1(){ echo "test1 method in trait1\n"; } public function test2(){ echo "test2 method in trait1\n"; } } trait trait2{ public function test1(){ echo "test1 method in trait2\n"; } public function test2(){ echo "test2 method in trait2\n"; } } //使用特质 and 父类 class testclass { use trait1, trait2{ trait1::test1 insteadof trait2; trait2::test2 insteadof trait1; } } $obj=new testclass(); $obj->test1(); $obj->test2(); ?>
输出结果
上面的脚本产生以下结果
test1 method in trait1 test2 method in trait2