Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:在运行另一个类方法时运行类方法?_Php_Class_Methods_Listener - Fatal编程技术网

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

PHP:在运行另一个类方法时运行类方法?,php,class,methods,listener,Php,Class,Methods,Listener,PHP: 运行特定类方法时运行函数 我想要的是在运行类方法时运行一些附加函数,而不改变已经存在的类 如何操作?这是不可能的,您必须更改函数才能实现这一点。但是您可能需要一个(zend的人也描述了)您最好的选择是扩展原始类并覆盖添加代码的方法 class MyClass extends OriginalClass { public function originalMethod() { parent::originalMethod(); // My

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

我想要的是在运行类方法时运行一些附加函数,而不改变已经存在的类


如何操作?

这是不可能的,您必须更改函数才能实现这一点。但是您可能需要一个(zend的人也描述了)

您最好的选择是扩展原始类并覆盖添加代码的方法

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

        // My code...
    }
}

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

你想做的事叫做

目前PHP不支持这种开箱即用的方式,尽管您可以使用扩展。下面是一篇解释一些选项的帖子:

  • :替换、重命名和删除用户定义的函数和类
  • :在调用指定函数/方法之前或之后调用回调
  • :允许用户在调用指定函数或方法时调用用户空间函数
使用这些并不一定是一个好主意。

使用:


以上假设您要调用的方法是
$decoratedInstance

上的
public
,谢谢。另外,添加这个函数也有帮助:function&u get($prop_name){if(isset($this->originalClass->$prop_name)){return$this->originalClass->$prop_name;}否则{return false;}}:绝对是的,但为了简洁起见,我跳过了它。
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
            );
        }
    }
}