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