PHP Componere是一个功能强大的库,用于在运行时对类进行组合、猴子补丁和类型转换。它旨在用于生产环境,提供了一组简单而灵活的API。本篇教程主要介绍了Componere的功能以及各种条件下的使用方法。
一、概述
Componere的主要功能包括:
1、组合(Composition):使用Componere\Definition可以在运行时定义或重新定义一个类。通过定义新的类,它可以替换原始类,并在注册后可供使用。
2、猴子补丁(Monkey Patching):使用Componere\Patch可以在运行时更改特定对象实例的类。补丁可以保持应用状态,并可以显式地还原。
注:这个叫法起源于Zope框架,大家在修正Zope的Bug的时候经常在程序后面追加更新部分,这些被称作是“杂牌军补丁(guerilla patch)”,后来guerilla就渐渐的写成了gorllia((猩猩),再后来就写了monkey(猴子),所以猴子补丁的叫法是这么莫名其妙的得来的。
3、类型转换(Casting):Componere提供了一组函数,可以在用户定义的兼容类型之间进行类型转换。这些函数可以将对象转换为指定的类型,前提是类型是对象类型的子类型或超类型。
二、Componere\Abstract\Definition
Componere\Abstract\Definition类代表了一个类的入口,程序员不应该使用它。
类摘要:
final abstract class Componere\Abstract\Definition { /* 方法 */ public addInterface(string $interface): Definition public addMethod(string $name, Componere\Method $method): Definition public addTrait(string $trait): Definition public getReflector(): ReflectionClass }
这个类是Componere库中的一个抽象类,它提供了一些方法来定义和操作类。然而,这个类是最终抽象类,意味着程序员不能直接使用它,而是通过其他具体的类来进行类的定义和操作。
这个类具有以下方法:
- addInterface(string $interface): Definition:向类定义中添加一个接口,并返回Componere\Abstract\Definition实例。这个方法用于给类定义添加接口;
- addMethod(string $name, Componere\Method $method): Definition:向类定义中添加一个方法,并返回Componere\Abstract\Definition实例。这个方法用于给类定义添加方法;
- addTrait(string $trait): Definition:向类定义中添加一个特征(trait),并返回Componere\Abstract\Definition实例。这个方法用于给类定义添加特征;
- getReflector(): ReflectionClass:获取类定义的反射类(ReflectionClass)实例。这个方法用于获取类定义的反射信息,可以用于进一步的类操作和分析。
三、Componere\Definition
定义类允许程序员在运行时构建和注册一个类型。如果一个定义替换了一个现有的类,那么当该定义被销毁时,现有的类将被恢复。
类摘要:
final class Componere\Definition extends Componere\Abstract\Definition { /* Constructors */ 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 /* 继承的方法 */ 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 public Componere\Abstract\Definition::getReflector(): ReflectionClass }
四、Componere\Patch
Patch 类允许程序员在运行时更改实例的类型,而无需注册新的定义。
当补丁程序被销毁时,它将被还原,因此在补丁程序生命周期内打过补丁的实例将恢复到它们的正式类型。
类摘要:
final class Componere\Patch extends Componere\Abstract\Definition { /* Constructors */ public __construct(object $instance) public __construct(object $instance, array $interfaces) /* 方法 */ public apply(): void public revert(): void public isApplied(): bool public derive(object $instance): Patch public getClosure(string $name): Closure public getClosures(): 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 public Componere\Abstract\Definition::getReflector(): ReflectionClass }
五、Componere\Method
Componere\Method表示一个具有可修改可访问性标志的函数。
类摘要:
final class Componere\Method { /* Constructor */ public __construct(Closure $closure) /* 方法 */ public setPrivate(): Method public setProtected(): Method public setStatic(): Method public getReflector(): ReflectionMethod }
六、Componere\Value
Componere\Value代表所有类型的 PHP 变量,包括未定义的。
类摘要:
final class Componere\Value { /* Constructor */ public __construct( $default = ?) /* 方法 */ public setPrivate(): Value public setProtected(): Value public setStatic(): Value public isPrivate(): bool public isProtected(): bool public isStatic(): bool public hasDefault(): bool }
七、Componere函数
1、Componere\cast
Componere\cast(Type $type, $object): Type
Componere\cast(Type $type, $object)是Componere库中的一个函数,用于将给定的对象强制转换为指定的类型。
- $type:要转换为的类型,必须是一个Type对象;
- $object:要转换的对象,可以是任何类型。
2、Componere\cast_by_ref
Componere\cast_by_ref(Type $type, $object): Type
- $type:用户定义的类型;
- $object:用户定义的类型与类型兼容的对象。