PHP: Как можно переименовать методы? - PullRequest
1 голос
/ 31 июля 2010

Можно ли переименовать метод класса в PHP 5.2 во время выполнения? Можно ли это сделать с помощью Reflection?

Дано:

class Test
{
    public function myMethod()
    {
        echo 'in my method';
    }
}

Я хочу переименовать myMethod() в oldMethod(), чтобы позже я сделал это:

$test = new Test();
$test->oldMethod(); // in my method
$test->myMethod(); // run time error: method does not exist

Ответы [ 3 ]

4 голосов
/ 02 августа 2010

Из комментария ниже вопрос:

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

Решение: используйте Decorator.

class EventDecorator
{
    protected $_instance;
    public function __construct($instance)
    {
        $this->_instance = $instance;
    }
    public function __get($prop)
    {
        printf('Getting %s in %s', $prop, get_class($this->_instance));
        return $this->_instance->$prop;
    }
    public function __set($prop, $val)
    {
        printf('Setting %s with %s in %s',
            $prop, $val, get_class($this->_instance));
        return $this->_instance->$prop = $val;
    }
    public function __call($method, $args)
    {
        printf('Calling %s with %s in %s', 
            $method, var_export($args, TRUE), get_class($this->_instance));

        return call_user_func_array(array($this->_instance, $method), $args);
    }
}

Затем вы можете обернуть в него любой класс:

class Foo
{
    public $prop;
    public function doSomething() {}
}

$foo = new EventDecorator(new Foo);
$foo->prop = 'bar'; // Setting prop with bar in Foo    
$foo->prop;         // Getting prop in Foo
$foo->doSomething('something'); 
// Calling doSomething with array (0 => 'something',) in Foo

Это можно выделить, чтобыи постить крючки.Вы также можете заставить декоратор использовать шаблон субъекта / наблюдателя и запускать события для любого другого объекта, зарегистрированного в декораторе.Приведенный выше подход более понятен и понятен, чем использование произвольных методов с использованием runkit.

Дополнительные примечания:

2 голосов
/ 31 июля 2010

Используя Runkit s runkit_method_rename вы можете сделать это.

1 голос
/ 02 августа 2010

Для всех вас, кто спрашивает, зачем вам это нужно, у меня есть идея, которая очень похожа.Моя идея состоит в том, чтобы попытаться переименовать целый класс PHP на лету.В моем случае он будет использоваться для бота IRC-чата, в котором я буду загружать и создавать плагины на лету, так что мне не нужно будет перезагружать бота, и время безотказной работы будет очень долгим.Это будет включать переименование предварительно загруженных классов с тем же именем, что и класс, который я пытаюсь загрузить, чтобы не было конфликта и он работал бы правильно.

Например:

У меня $bot работает на irc.example.com

У меня установлен и работает плагин test.php, теперь, когда он загружен в память, я могу изменить файл test.php без каких-либо изменений на $bot

Итак, я обновляю test.php

Теперь я хочу, чтобы он загрузился в $bot, но $bot уже имеет тестовую загрузку, и он будет конфликтовать, еслиЯ попытался включить test.php снова

, поэтому вместо этого мы запускаем функцию переименования, чтобы переименовать класс test в class test [sha1 счетчика]

, а затем мы включаем 'test.php'

$bot->test = new test();

и вот он, обновленный тестовый плагин, установленный и загруженный в память на $bot без перезагрузки.

Это все теория, но об этом нужно подумать раньшемгновенно разжигая кого-то за свои идеи с помощью «Почемутебе даже нужно такое "отношение".

Я имею в виду, давайте будем честными здесь.Каковы шансы, что вы супер гений, который знает все, что нужно знать о программировании, и знает, что всем будет или не нужно?

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