🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Definition类允许程序员在类运行时动态的构建和注册类型(属性??)。 如果定义替换现有的类,则在销毁定义时将还原现有的类 ``` final Componere\Definition extends Componere\Abstract\Definition { /* Constructors */ public __construct ( string $name )//name:不区分大小写的类名 public __construct ( string $name , string $parent )//parent:不区分大小写的类名 public __construct ( string $name , array $interfaces )//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 ) : void 注册 public isRegistered ( void ) : bool 状态检测 public getClosure ( string $name ) : \Closure 获取指定闭包 public getClosures ( void ) : array 获取全部闭包 /* 继承的方法 */ public Componere\Abstract\Definition::addInterface ( string $interface ) : Definition 添加接口 public Componere\Abstract\Definition::addMethod ( string $name , \Componere\Method $method ) : Definition 添加方法 public Componere\Abstract\Definition::addTrait ( string $trait ) : Definition 添加Trait public Componere\Abstract\Definition::getReflector ( void ) : \ReflectionClass 反射 } name:不区分大小写的类名 parent:不区分大小写的类名 interfaces:不区分大小写的类名数组 ``` 在本例中,一个子类将扩展一个“final”类(通常情况下final类是不能有子类的,我们可以通过Componere实现子类继承它),并添加一个方法。对象实例将能够访问父成员,并且被识别为动态创建的子类及其父类的实例。 ``` declare(strict_types=1); /* * Final类通常会阻止扩展子类 */ final class ParentC { public $parentvar; public $name; function __construct() { $this->parentvar = get_class().'_value'; } function parentfunc() { echo get_class().'类->parentfunc方法输出: '.$this->parentvar; echo '<br>'; } } /* * 动态定义一个继承与ParentC的类 DynamicSon */ $DefClass = new \Componere\Definition( 'DynamicSon', 'ParentC'); // 用Method类扩展子类的方法'DynamicSon::dynamicfunc()'. $DefMethod = new Componere\Method( function( $parm = null ) { // 填充父类属性. if (empty($parm)) { $this->name =get_class().'->dynamicfunc'; }else{ $this->name = $parm; } // 访问父构造函数设置的继承属性. echo get_class().'类->dynamicfunc方法输出: '.$this->parentvar.'<br>'; } ); $DefClass->addMethod( 'dynamicfunc', $DefMethod ); // 注册子类 $DefClass->register(); /* * 实例化动态子类,并访问它自己的和继承的成员. */ $dynamicSon = new DynamicSon; $dynamicSon->parentfunc();//调用父类方法 $dynamicSon->dynamicfunc( 'haha'); var_dump( $dynamicSon ); ``` 输出: ``` ParentC类->parentfunc方法输出: ParentC_value DynamicSon类->dynamicfunc方法输出: ParentC_value object(DynamicSon)#3 (2) { ["parentvar"]=> string(13) "ParentC_value" ["name"]=> string(4) "haha" } ```