是否可以将具有匿名函数的数组分配给PHP中的类属性?

时间:2019-02-08 12:28:12

标签: php oop closures

[使用PHP 5.5]

因此,我试图创建一种解决方案,以便在将Twig函数追加到$this->functions(一个填充了我希望Twig扩展的函数的数组)后加载它们

class Twig
{
    private $twig;
    private $templatesBaseDir = "../app/views";
    private $functions = [
        "lipsum" => function ($pcount, $psize) {
            return file_get_contents("http://loripsum.net/api/{$pcount}/{$psize}/headers");
        }
    ];

    /**
     * Sets Twig Environment configs
     */
    public function __construct()
    {
        $this->twig = new \Twig_Environment($this->loadViews(), [
            "debug" => true,
            // "cache" => "/cache",
            "auto_reload" => true,
        ]);
    }

    /**
     * Returns Twig setup (environment configs + templates path)
     */
    public function loadTwig()
    {
        return $this->twig;
    }

    private function loadTwigFunctions()
    {
        foreach ($this->functions as $name => $closure) { 
            $$name = new \Twig_Function($name, $closure);
            $this->twig->addFunction($$name);
        }
    }
}

问题是PHP返回"lipsum" => function ($pcount, $psize) {行的错误:

  

意外的“函数”(T_FUNCTION),需要标识符(T_STRING)

我已经使用数组和匿名函数在全局范围内对该方法进行了一些测试,并且按预期方式工作,我想将其与类属性或类似属性一起使用时可能会出现问题,不确定。

(这是我在这里的第一个问题,所以让我知道是否需要更多信息)

1 个答案:

答案 0 :(得分:3)

问题在于您的财产的初始价值。

根据manual on properties

  

...通过使用以下关键字之一定义:public,protected或   私有,然后是普通的变量声明。这个宣言   可能包含初始化,但此初始化必须是   常数值-也就是说,必须能够在编译时求值   时间,并且不得依赖于运行时信息   评估。

由于匿名函数无法在编译时求值,因此无法在此处进行设置。

例如在构造函数中设置$this->functions的值,它应该可以正常工作。