Переопределить ранее использованные функции - PullRequest
1 голос
/ 30 сентября 2011

Я нахожусь в процессе создания irc бота с PHP.Во время разработки я хочу иметь возможность динамически загружать и выгружать классы / функции.

Имейте в виду, PHP поддерживает активность.

ex:

Основной файл :

class stuff {

    function stuff() { echo 'this'; }

    function replaceFunction() {
        remove(stuff);
        add(stuff);
    }
}
$stuff = new stuff();

Далее

Я редактирую функцию :

function stuff() { echo 'that'; }

В идеале, теперь, когда она отредактирована,все, что мне нужно сделать, это вызвать метод replaceFunction (), чтобы обновить старую функцию.

Как я могу заставить это на самом деле работать?

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Если вам нужно только иметь класс, имеющий функцию, и вы хотите иметь возможность обмениваться функциями этой функции, вызывая replaceFunction, вы можете назначить некоторое закрытие дляэтот класс или аналогичный:

class stuff {
    private $callback;
    public function __construct()
    {
        $this->callback = array($this, 'stuff');
    }

    public function __invoke()
    {
        call_user_func($this->callback);
    }   

    private function stuff() { echo 'This'; }

    function replace($function) {
        $this->callback = $function;
    }
}


$stuff = new stuff;

$stuff(); # original function

$stuff->replace(function() { echo 'That'; });

$stuff(); # replaced function

или короткая версия:

$stuff = function() {echo 'This';};

$stuff(); # original function

$stuff = function() {echo 'That';};

$stuff(); # replaced function

Преимущество этого класса в том, что вы имеете больше возможностей для назначения и вызова функции.

0 голосов
/ 30 сентября 2011

Может быть, вы можете сначала удалить функции

runkit_function_remove ( string $funcname );

Используйте function_exists(), чтобы проверить, существует ли функция.

EDIT:

class stuff {
    function replaceFunction() {
        runkit_function_remove('stuff');
        function stuff() { echo 'New stuff'; }
    }
}
$stuff = new stuff();
$stuff->replaceFunction();
...