dandjo / object-adapter
为目标对象提供适配器,通过魔法获取器和设置器轻松访问属性。
7.0.1
2023-01-19 11:08 UTC
Requires
- php: >=8.0
- ext-json: *
README
提供一些基础类,用于通过注解属性访问适配目标对象。
安装
composer require dandjo/object-adapter
目的
其目的是在处理类似于Twig的模板引擎背后的复杂对象时使生活变得更轻松。它提供了一些语法糖,例如使用注解编写方法并通过适配器上的注解属性名访问返回值。这同样适用于设置器。它还提供了一种通用的获取方法,用于使用点符号表示法访问嵌套数据结构。为此,链中的每个链接都必须是ObjectAdapter的实例或可访问的属性。
使用
要为您的适配器提供一个属性,您必须使用 @property\getter property_name 或 @property\setter property_name 注解一个适当的方法。设置器方法必须接受一个参数,该参数包含应设置的属性的值。方法名可以是任意选择的。然而,注解很重要。如果没有获取器或设置器,适配器对其目标对象的行为是透明的。
示例
假设您有一个具有一些属性的对象,我们的目标对象。当直接使用ObjectAdapter基类时,所有属性默认都是透明的。
$targetObject = new \stdClass(); $targetObject->foo = 'bar'; $myAdapter = new \Dandjo\ObjectAdapter\ObjectAdapter($targetObject); echo $myAdapter->foo; // 'bar'
我们从ObjectAdapter继承并为目标对象上的foo属性创建一个获取器。通过注解,适配器提供了一个名为myFoo的属性。
class MyAdapter extends \Dandjo\ObjectAdapter\ObjectAdapter { /** * @property\getter myFoo */ public function getMyFoo(): string { return $this->targetObject->foo; } } $targetObject = new \stdClass(); $targetObject->foo = 'bar'; $myAdapter = new MyAdapter($targetObject); echo $myAdapter->myFoo; // 'bar' echo $targetObject->foo; // 'bar'
下面是一个设置器的示例。
class MyAdapter extends \Dandjo\ObjectAdapter\ObjectAdapter { /** * @property\setter myFoo */ public function setMyFoo($value): \Dandjo\ObjectAdapter\ObjectAdapter { $this->targetObject->foo = $value; } } $targetObject = new \stdClass(); $targetObject->foo = 'bar'; $myAdapter = new MyAdapter($targetObject); echo $myAdapter->myFoo; // 'bar' $myAdapter->myFoo = 'baz'; echo $myAdapter->myFoo; // 'baz' echo $targetObject->foo; // 'baz'
如果您想使用深层次的对象层次结构,请查看以下示例。链式调用是安全的,因为每个不存在的属性都会返回一个NullAdapter。
class MyChildAdapter extends \Dandjo\ObjectAdapter\ObjectAdapter { /** * @property\getter myFoo */ public function getMyFoo(): string { return $this->targetObject->foo; } } class MyAdapter extends \Dandjo\ObjectAdapter\ObjectAdapter { /** * @property\getter myChild */ public function getMyChild(): string { return new MyChildAdapter($this->targetObject->child); } } $targetObject = new \stdClass(); $targetObject->child = new \stdClass(); $targetObject->child->foo = 'bar'; $myAdapter = new MyAdapter($targetObject); echo $myAdapter->myChild->myFoo; // 'bar'
每个适配器都实现了ArrayAccess和Interator接口,因此您也可以像以下那样访问或遍历注解属性。
class MyAdapter extends \Dandjo\ObjectAdapter\ObjectAdapter { /** * @property\getter myFoo */ public function getMyFoo(): string { return $this->targetObject->foo; } } $targetObject = new \stdClass(); $targetObject->foo = 'bar'; $myAdapter = new MyAdapter($targetObject); echo $myAdapter['foo']; // 'bar' echo $myAdapter['myFoo']; // 'bar' foreach ($myAdapter as $propertyName => $propertyValue) { echo "$propertyName: $propertyValue"; // myFoo: bar }