0

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

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

如何?

4

5 回答 5

5

使用装饰器

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.

于 2010-02-01T11:06:39.740 回答
1

这是不可能的,您必须更改功能才能实现。但是你可能需要一个观察者模式(zend 的人也在 zend.com 上描述了观察者模式

于 2010-02-01T10:59:47.227 回答
1

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

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

        // My code...
    }
}

$myClass = new MyClass();
$myClass->originalMethod();
于 2010-02-01T11:02:08.297 回答
1

您正在尝试做的事情称为Aspect Oriented Programming

目前 PHP 不支持开箱即用,尽管您可以使用扩展。这是解释一些选项的帖子: http: //sebastian-bergmann.de/archives/573-Current-State-of-AOP-for-PHP.html

于 2010-02-01T11:03:53.960 回答
1
  • runkit:替换、重命名和删除用户定义的函数和类。
  • funcall:在调用指定函数/方法之前或之后调用回调。
  • intercept:允许用户在调用指定的函数或方法时调用用户空间函数。

并不是说使用这些一定是一个好主意。

于 2010-02-01T11:04:53.787 回答