Componere\Definition 类

(Componere 2 >= 2.1.0)

简介

Definition 类允许程序员在运行时构建和注册一个类型。

如果 Definition 替换了现有的类,则在 Definition 被销毁时将恢复现有的类。

类概要

final class Componere\Definition extends Componere\Abstract\Definition {
/* 构造函数 */
public __construct(string $name)
public __construct(string $name, string $parent)
public __construct(string $name, array $interfaces)
public __construct(string $name, string $parent, array $interfaces)
/* 方法 */
public addConstant(string $name, Componere\Value $value): Definition
public addProperty(string $name, Componere\Value $value): Definition
public register(): void
public isRegistered(): bool
public getClosure(string $name): Closure
public getClosures(): array
/* 继承的方法 */
}

目录

添加笔记

用户贡献的笔记 1 条笔记

ASchmidt at Anamera dot net
6 年前
有时我们可能希望扩展一个定义为“final”的第三方类。

在这个例子中,子类将扩展“final”类,添加一个方法。对象实例将能够访问父类成员,并且被识别为动态创建的子类及其父类的实例。

<?php
declare(strict_types=1);

/*
* 最终类通常会阻止扩展。
*/
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 ); }
}

/*
* 动态定义一个子类 “DynamicC”
* 它成功地扩展了最终类 “ParentC”。
*/
$DefC = new \Componere\Definition( 'DynamicC', 'ParentC');

// 用方法 “DynamicC::dynamicf()” 扩展子类。
$DefM = new Componere\Method( function( $parm = null ) {
// 填充父类属性。
$this->secondvar = empty( $parm ) ? 'set by '.get_class().'->dynamicf' : $parm;
// 访问父类构造函数设置的继承属性。
echo( "\r\n<br/>".get_class().'->dynamicf >> '.$this->parentvar );
} );
$DefC->addMethod( 'dynamicf', $DefM );

// 获取动态子类 “life”。
$DefC->register();

/*
* 实例化动态子类,
* 访问其自身和继承的成员。
*/

$dyno = new DynamicC;
$dyno->parentf();
$dyno->dynamicf( 'myvalue ');

// 我们的对象也被识别为父类的实例!
var_dump( $dyno instanceof DynamicC, $dyno instanceof ParentC );
var_dump( $dyno );
%>

将输出:

set by ParentC->parentconstruct
ParentC
->parentf >> set by ParentC->parentconstruct
DynamicC
->dynamicf >> set by ParentC->parentconstruct

(boolean) true
(boolean) true

object
(DynamicC)
public
'parentvar' => string 'set by ParentC->parentconstruct' (length=31)
public
'secondvar' => string 'myvalue ' (length=8)
To Top