Как я могу ссылаться на функции PHP? - PullRequest
0 голосов
/ 28 февраля 2011

Я создаю систему плагинов.У меня есть класс extensionmanager, который принимает имя плагина в качестве параметра конструктора.Короче говоря, это код, который я пытаюсь запустить:

$this->parsedata = function($data) { 
    $this->extension::parsedata($data); 
};

$this-extension - это строка с именем плагина.Я запускал статические функции точно так, как показано в этом примере ранее.Теперь я получаю сообщение об ошибке unexpected T_PAAMAYIM_NEKUDOTAYIM во второй строке (я слышал, что оно примерно переводится как «неожиданное двойное двоеточие»)

Может кто-нибудь помочь мне понять, почему?


Перед приведенным выше примером я попытался запустить что-то вроде этого

$this->parsedata = &$this->extension::parsedata;

Отсюда и название вопроса.Верхний пример, который я думал, был ближе к работе, поэтому я изменил его.

Ответы [ 2 ]

3 голосов
/ 28 февраля 2011

Сделай это:

$self = $this;
$this->parsedata = function($data) use ($self) { 
    {$self->extension}::parsedata($data); 
};

Тем не менее, я бы предложил избегать статических функций. В конце концов, тот, кто собирается использовать ваш менеджер расширений, должен будет соответствовать какому-либо интерфейсу. Почему бы не воспользоваться абстрактными методами или интерфейсами, чтобы пользователь соответствовал вашему интерфейсу?

3 голосов
/ 28 февраля 2011

call_user_func может дать вам решение.Где-то в примерах у вас есть этот код:

<?php

namespace Foobar;

class Foo {
    static public function test() {
        print "Hello world!\n";
    }
}

call_user_func(__NAMESPACE__ .'\Foo::test'); // As of PHP 5.3.0
call_user_func(array(__NAMESPACE__ .'\Foo', 'test')); // As of PHP 5.3.0

?>

Я думаю, вы можете легко адаптировать это для вызова вашей статической функции.Например что-то вроде:

call_user_func(array($this->extension, 'parseData'), $data);
...