Adding a trait is an efficient way to extend a "final" class, overriding methods and adding new ones, without having to individually add each method as a closure. It also results in more readable code.
<?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 );
?>
will output:
set by ParentC->parentconstruct
ChildC->overridden_constructor >> set by ParentC->parentconstruct
ParentC->parentf >> set by ParentC->parentconstruct
ChildC->overridden_parentf >> set by ParentC->parentconstruct
ChildC->dynamicf >> set by ParentC->parentconstruct
boolean true
boolean true
boolean true
object(ChildC)[2]
public 'parentvar' => string 'set by ParentC->parentconstruct' (length=31)
public 'secondvar' => string 'myvalue ' (length=8)
PHP.mk документација
Componere\Abstract\Definition::addTrait
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Патека
componere-abstract-definition.addtrait.php
Локална патека за оваа страница.
Извор
php.net/manual/en
Оригиналниот HTML се реупотребува и локално се стилизира.
Режим
Прокси + превод во позадина
Кодовите, табелите и белешките остануваат читливи во истиот тек.
Референца
componere-abstract-definition.addtrait.php
Componere\Abstract\Definition::addTrait
Референца за `componere-abstract-definition.addtrait.php` со подобрена типографија и навигација.
Componere\Abstract\Definition::addTrait
(Componere 2 >= 2.1.0)
Componere\Abstract\Definition::addTrait — (Componere 2 >= 2.1.0)
Параметри
trait- Ќе го користи дадениот атрибут за тековната дефиниција
Вратени вредности
Името на атрибутот кое не прави разлика помеѓу големи и мали букви
Исклучоци
Ги ескејпува специјалните знаци во стринг за употреба во SQL изјава
Тековната Дефиниција RuntimeException if Уништено од Ќе фрли
Белешки од корисници 1 белешка
Tr909 at com dot nospam dot bigfoot ¶
пред 8 години