置信大家对 trait 曾经不生疏了,早在 5.4 时,trait 就曾经呈现在了 PHP 的新个性中。当然,自身 trait 也是个性的意思,但这个个性的次要能力就是为了代码的复用。
咱们都晓得,PHP 是现代化的面向对象语言。为了解决 C ++ 多重继承的凌乱问题,大部分语言都是单继承多接口的模式,但这也会让一些能够复用的代码必须通过组合的形式来实现,如果要用到组合,不可避免的就要实例化类或者应用静态方法,无形中减少了内存的占用。而 PHP 为了解决这个问题,就正式推出了 trait 能力。你能够把它看做是组合能力的一种变体。
trait A
{
public $a = 'A';
public function testA()
{echo 'This is' . $this->a;}
}
class classA
{use A;}
class classB
{
use A;
public function __construct()
{$this->a = 'B';}
}
$a = new classA();
$b = new classB();
$a->testA();
$b->testA();
从上述代码中,咱们能够看出,trait 能够给利用于任意一个类中,而且能够定义变量,十分不便。trait 最须要留神的是对于同名办法的重载优先级问题。
trait B {function test(){echo 'This is trait B!';}
}
trait C {function test(){echo 'This is trait C!';}
}
class testB{
use B, C;
function test(){echo 'This is class testB!';}
}
$b = new testB();
$b->test(); // This is class testB!
// class testC{
// use B, C;
// }
// $c = new testC();
// $c->test(); // Fatal error: Trait method test has not been applied, because there are collisions with other trait methods on testC
在这里,咱们的类中重载了 test() 办法,这里输入的就是类中的办法了。如果正文掉 testB 类中的 test() 办法,则会报错。因为程序无奈辨别出你要应用的是哪一个 trait 中的 test() 办法。咱们能够应用 insteadof 来指定要应用的办法调用哪一个 trait。
class testE{
use B, C {
B::test insteadOf C;
C::test as testC;
}
}
$e = new testE();
$e->test(); // This is trait B!
$e->testC(); // This is trait C!
当然,事实开发中还是尽量标准办法名,不要呈现这种反复状况。另外,如果子类援用了 trait,而父类又定义了同样的办法呢?当然还是调用父类所继承来的办法。trait 的优先级是低于一般的类继承的。
trait D{function test(){echo 'This is trait D!';}
}
class parentD{function test(){echo 'This is class parentD';}
}
class testD extends parentD{use D;}
$d = new testD();
$d->test(); // This is trait D!
最初,trait 中也是能够定义形象办法的。这个形象办法是援用这个 trait 的类所必须实现的办法,和抽象类中的形象办法成果统一。
trait F{function test(){echo 'This is trait F!';}
abstract function show();}
class testF{
use F;
function show(){echo 'This is class testF!';}
}
$f = new testF();
$f->test();
$f->show();
trait 真的是 PHP 是非常灵活的一个性能。当然,越是灵便的货色越须要咱们去弄明确它的一些应用规定,这样能力防止一些不可预感的谬误。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/trait%E8%83%BD%E5%8A%9B%E5%9C%A8PHP%E4%B8%AD%E7%9A%84%E4%BD%BF%E7%94%A8.php
参考文档:
https://www.php.net/manual/zh/language.oop5.traits.php
各自媒体平台均可搜寻【硬核项目经理】