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

问题描述:

PHP:当一个特定的类方法运行PHP:运行另一个类方法时运行类方法?

我要的是,当在不改变已经存在的类是运行一个类的方法来运行一些附加功能 运行功能。

怎么样?

随着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

+0

完美无缺的作品,谢谢。 也加入这有助于: \t功能&__得到($ prop_name){ \t \t如果(isset($这个 - > originalClass - > $ prop_name)){ \t \t \t回$这个 - > originalClass - > $ prop_name; \t \t} else { \t \t \t return false; \t \t} \t} :P – 2010-02-01 12:02:21

+0

绝对没错,但为了简洁起见,我跳过它。 – Gordon 2010-02-01 12:09:03

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

你最好的选择是延长原来的类,并重写添加你的代码的方法。

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

     // My code... 
    } 
} 

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

你所试图做的是叫做Aspect Oriented Programming

目前虽然您可以使用扩展名,但PHP并不支持这种开箱即用的功能。下面是帖子,解释一些选项:http://sebastian-bergmann.de/archives/573-Current-State-of-AOP-for-PHP.html

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

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