PHP Conference Japan 2024

Componere\Abstract\Definition::addTrait

(Componere 2 >= 2.1.0)

Componere\Abstract\Definition::addTrait新增 Trait

說明

public Componere\Abstract\Definition::addTrait(字串 $trait): Definition

將使用給定的 trait 應用於目前的定義

參數

trait

Trait 名稱(不區分大小寫)

回傳值

目前的 Definition

例外

警告

如果已註冊 Definition,將會拋出 RuntimeException

新增註解

使用者貢獻的註解 1 則註解

ASchmidt at Anamera dot net
6 年前
新增 Trait 是一種有效擴展「final」類別的方式,可以覆寫方法並新增方法,而無需將每個方法單獨新增為閉包。它也能使程式碼更易讀。

<?php
declare(strict_types=1);

/*
* Final class would normally prevent extending.
*/
final class ParentC
{
public
$parentvar;
public
$secondvar;

function
__construct() { echo( "\r\n<br/>".$this->parentvar = 'set by '.get_class().'->parentconstruct' ); }
function
parentf() { echo( "\r\n<br/>".get_class().'->parentf >> '.$this->parentvar ); }
}

/*
* Extended class members.
*/
trait ChildC /* extends ParentC */
{
function
__construct() {
// Call parent constructor.
parent::__construct();
// Access an inherited property set by parent constructor.
echo( "\r\n<br/>".get_class().'->overridden_constructor >> '.$this->parentvar );
}

function
parentf() {
// Call overridden parent method.
parent::parentf();
// Access an inherited property set by constructor.
echo( "\r\n<br/>".get_class().'->overridden_parentf >> '.$this->parentvar );
}

function
dynamicf( $parm = null ) {
// Populate a parent class property.
$this->secondvar = empty( $parm ) ? 'set by '.get_class().'->dynamicf' : $parm;
// Access an inherited property set by parent constructor.
echo( "\r\n<br/>".get_class().'->dynamicf >> '.$this->parentvar );
}
}

/*
* Register the dynamic child class "ChildC", which is
* derived by extending "ParentC" with members supplied as "ChildC" trait.
*/
$definition = new \Componere\Definition( 'ChildC', ParentC::class );
$definition->addTrait( 'ChildC' );
$definition ->register();

/*
* Instantiate the dynamic child class,
* and access its own and inherited members.
*/
$dyno = new ChildC;
$dyno->parentf();
$dyno->dynamicf( 'myvalue ');

// Our object is also recognized as instance of parent!
var_dump( $dyno instanceof ChildC, $dyno instanceof ParentC, is_a( $dyno, 'ParentC') );
var_dump( $dyno );
?>

將會輸出

由 ParentC->parentconstruct 設定
ChildC->overridden_constructor >> 由 ParentC->parentconstruct 設定
ParentC->parentf >> 由 ParentC->parentconstruct 設定
ChildC->overridden_parentf >> 由 ParentC->parentconstruct 設定
ChildC->dynamicf >> 由 ParentC->parentconstruct 設定

布林值 真
布林值 真
布林值 真

物件(ChildC)[2]
公開 'parentvar' => 字串 '由 ParentC->parentconstruct 設定' (長度=31)
公開 'secondvar' => 字串 'myvalue ' (長度=8)
To Top