dandjo/object-adapter

为目标对象提供适配器,通过魔法获取器和设置器轻松访问属性。

7.0.1 2023-01-19 11:08 UTC

This package is auto-updated.

Last update: 2024-09-19 14:44:29 UTC


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'

每个适配器都实现了ArrayAccessInterator接口,因此您也可以像以下那样访问或遍历注解属性。

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
}