PHP:运行另一个类方法时运行类方法?

时间:2010-02-01 10:58:11

标签: php class methods listener

PHP: 运行特定的类方法时运行函数

我想要的是在运行类方法时运行一些额外的函数而不改变已经存在的类。

如何?

5 个答案:

答案 0 :(得分:5)

使用decorator

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 :(得分:1)

这是不可能的,你将不得不改变功能来实现这一目标。但是你可能需要一个observer pattern(zend家伙也会描述observer pattern on zend.com

答案 2 :(得分:1)

最好的办法是扩展原始类并覆盖添加代码的方法。

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

        // My code...
    }
}

$myClass = new MyClass();
$myClass->originalMethod();

答案 3 :(得分:1)

您要做的事情称为Aspect Oriented Programming

目前,PHP不支持开箱即用,但您可以使用扩展程序。这篇文章解释了一些选项:http://sebastian-bergmann.de/archives/573-Current-State-of-AOP-for-PHP.html

答案 4 :(得分:1)

  • runkit:替换,重命名和删除用户定义的函数和类。
  • funcall:在调用指定的函数/方法之前或之后调用回调函数。
  • intercept:允许用户在调用指定的函数或方法时调用用户空间函数。

并非使用这些都是一个好主意。