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