Можно ли назначить массив с анонимными функциями для свойства класса в PHP? - PullRequest
0 голосов
/ 08 февраля 2019

[Использование 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 голосов
/ 08 февраля 2019

Проблема заключается в стоимости вашей собственности.

Согласно руководству по свойствам :

... Они определяются с использованием одного из ключевых слов public, protected или private, за которым следуетобъявление нормальной переменной.Это объявление может включать в себя инициализацию, но эта инициализация должна быть постоянным значением, то есть она должна быть в состоянии быть оцененной во время компиляции и не должна зависеть от информации времени выполнения для оценки.

Поскольку анонимная функция не может быть оценена во время компиляции, вы не можете установить ее там.

Она должна работать без проблем, если вы установите значение $this->functions, например, в конструкторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...