PHP: запустить метод класса при запуске другого метода класса? - PullRequest
0 голосов
/ 01 февраля 2010

PHP: запускать функцию при запуске метода определенного класса

я хочу запускать некоторые дополнительные функции при запуске метода класса без изменения уже существующего класса.

как

Ответы [ 5 ]

5 голосов
/ 01 февраля 2010

С декоратором :

class MyClassDecorator
{
    protected $decoratedInstance;

    public function __construct($decoratedInstance)
    {
        $this->decoratedInstance = $decoratedInstance;
    }

    public function methodNameInOriginalClass()
    {
        $this->decoratedInstance->methodIWantToRunBefore();
        $this->decoratedInstance->methodNameInOriginalClass();
        $this->decoratedInstance->methodIWantToRunAfter();
    }

    public function __call($method, $args)
    {
        if (method_exists($this->decoratedInstance, $method)) {
            return call_user_func_array(
                array($this->decoratedInstance, $method), 
                $args
            );
        }
    }
}

Выше предполагается, что методы, которые вы хотите вызвать, public на $decoratedInstance.

1 голос
/ 01 февраля 2010
  • runkit : заменять, переименовывать и удалять пользовательские функции и классы.
  • funcall : вызывать обратные вызовы до или после выполнения указанных функций / методовcall.
  • intercept : Позволяет пользователю вызывать функцию пространства пользователя, когда вызывается указанная функция или метод.

не то, что их использованиеобязательно хорошая идея.

1 голос
/ 01 февраля 2010

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

class MyClass extends OriginalClass
{
    public function originalMethod()
    {
        parent::originalMethod();

        // My code...
    }
}

$myClass = new MyClass();
$myClass->originalMethod();
1 голос
/ 01 февраля 2010

То, что вы пытаетесь сделать, называется Аспектно-ориентированное программирование .

В настоящее время PHP не поддерживает этого из коробки, хотя вы можете использовать расширения. Вот пост, который объясняет некоторые параметры: http://sebastian -bergmann.de / archives / 573-Current-State-of-AOP-for-PHP.html

1 голос
/ 01 февраля 2010

Это невозможно, вам придется изменить функцию, чтобы добиться этого. Но вам может понадобиться шаблон наблюдателя (Зендеры описывают шаблон наблюдателя на zend.com тоже)

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