添加 trait 是扩展“final”类的有效方法,可以覆盖方法并添加新方法,而无需单独将每个方法添加为闭包。它还可以使代码更具可读性。
<?php
declare(strict_types=1);
final class ParentC
{
public $parentvar;
public $secondvar;
function __construct() { echo( "\r\n<br/>".$this->parentvar = '由 '.get_class().'->parentconstruct 设置' ); }
function parentf() { echo( "\r\n<br/>".get_class().'->parentf >> '.$this->parentvar ); }
}
trait ChildC {
function __construct() {
parent::__construct();
echo( "\r\n<br/>".get_class().'->重写的构造函数 >> '.$this->parentvar );
}
function parentf() {
parent::parentf();
echo( "\r\n<br/>".get_class().'->重写的 parentf >> '.$this->parentvar );
}
function dynamicf( $parm = null ) {
$this->secondvar = empty( $parm ) ? '由 '.get_class().'->dynamicf 设置' : $parm;
echo( "\r\n<br/>".get_class().'->dynamicf >> '.$this->parentvar );
}
}
$definition = new \Componere\Definition( 'ChildC', ParentC::class );
$definition->addTrait( 'ChildC' );
$definition ->register();
$dyno = new ChildC;
$dyno->parentf();
$dyno->dynamicf( 'myvalue ' );
var_dump( $dyno instanceof ChildC, $dyno instanceof ParentC, is_a( $dyno, 'ParentC') );
var_dump( $dyno );
?>
将输出
由 ParentC->parentconstruct 设置
ChildC->重写的构造函数 >> 由 ParentC->parentconstruct 设置
ParentC->parentf >> 由 ParentC->parentconstruct 设置
ChildC->重写的 parentf >> 由 ParentC->parentconstruct 设置
ChildC->dynamicf >> 由 ParentC->parentconstruct 设置
布尔值 true
布尔值 true
布尔值 true
对象(ChildC)[2]
public 'parentvar' => 字符串 '由 ParentC->parentconstruct 设置' (长度=31)
public 'secondvar' => 字符串 'myvalue ' (长度=8)