Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 向细枝中的对象添加特性_Php_Twig - Fatal编程技术网

Php 向细枝中的对象添加特性

Php 向细枝中的对象添加特性,php,twig,Php,Twig,我想在twig中将属性2添加到此对象 object property1 根据这个问题,公认的答案是可以通过合并实现,但是合并过滤器不能处理对象,有什么方法可以实现吗 我不知道用小树枝做这件事的标准方法,但我认为你可以这样做: 1。创建客户细枝扩展 class TwigPropertySetter extends \Twig_Extension { function getName() { return 'property_setter'; }

我想在twig中将属性2添加到此对象

object
    property1

根据这个问题,公认的答案是可以通过合并实现,但是合并过滤器不能处理对象,有什么方法可以实现吗

我不知道用小树枝做这件事的标准方法,但我认为你可以这样做:

1。创建客户细枝扩展

class TwigPropertySetter extends \Twig_Extension {

    function getName() {
        return 'property_setter';
    }

    function getFunctions() {
        return [
            'setObjectProperty' => new \Twig_Function_Method($this, 'setObjectProperty')
        ];
    }

    function setObjectProperty($object, $propertyName, $propertyValue) {
        $object->{$propertyName} = $propertyValue;
        return $object;            
    }    
}
2。将扩展添加到细枝渲染器中

$twig = new Twig_Environment(null, $options);
$twig->addExtension(new TwigPropertySetter());
3。在细枝模板中使用函数

....
{% set object = setObjectProperty(object, 'property2', 'value2') %}
Show new object porperty {{ object.property2 }}
....

注意:未经测试我认为最优雅的方法是使用setter和getter:

class TestStdClass
{
    private $prop1;

    public function getProp1()
    {
        return $this->prop1;
    }

    public function setProp1($prop1)
    {
        $this->prop1 = $prop1;
    }
}
然后在细枝模板中,使用标记计算表达式(
obj
TestStdClass
的一个实例):

这将打印:

TestStdClass {#2468 ▼
  -prop1: "Hello"
}

您还可以向类中添加一个通用setter,以获得Kison解决方案中的动态性:

class Foo {
    public function setProperty($name, $value) {
        $this->$name = $value;
    }
}
然后在细枝上:

{% do obj.setProperty('property2', 'Second property') %}

这比Kison的解更简单,比martin的解更动态。但是,如果您有许多类需要这种通用setter,那么Kison的解决方案可能会更好,因为它更通用(即,您可以向任何类的对象添加属性).

编写自定义细枝函数怎么样?
getName
是从
twig\u扩展扩展时所必需的函数。这样,您需要在每个类中为每个属性添加getter和setter。当然,若我们将这样编写代码,这将更加清楚,但这并不是向对象附加新属性的通用方法。我的解决方案可以直接添加属性,而无需getter和setter。
{% do obj.setProperty('property2', 'Second property') %}