PHP Conference Japan 2024

Componere\Abstract\Definition::addTrait

(Componere 2 >= 2.1.0)

Componere\Abstract\Definition::addTrait添加 Trait

说明

public Componere\Abstract\Definition::addTrait(string $trait): Definition

为当前定义使用给定的 trait

参数

trait

不区分大小写的 trait 名称

返回值

当前的 Definition

异常

警告

如果 Definition 已注册,将抛出 RuntimeException

添加注释

用户贡献的注释 1 个注释

up
0
ASchmidt at Anamera dot net
6 年前
添加 trait 是扩展“final”类的有效方法,可以覆盖方法并添加新方法,而无需单独将每个方法添加为闭包。它还可以使代码更具可读性。

<?php
declare(strict_types=1);

/*
* Final 类通常会阻止扩展。
*/
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 /* extends ParentC */
{
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 );
}
}

/*
* 注册动态子类“ChildC”,它是
* 通过使用作为“ChildC”trait 提供的成员扩展“ParentC”而派生的。
*/
$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)
To Top