php中如何实现对一个已定义的类的方法调用的事件监听

发布于 2022-08-26 15:56:31 字数 377 浏览 9 评论 0

class a{
    function mycall($var){
        return 'hello:'.$var;
    }
}

//invoke
$aobj = new a();
echo $aobj->mycall('abc');

想实现不修改现有调用流程代码的情况下,实现,对已定义类方法(这里是'mycall')的事件监听 比如拦截和修改mycall的返回

我知道可以通过包装类的类似的方法来解决问题,但如果不想修改现有调用流程,仅仅在这些类定义之前或之后添加代码来解决问题呢? 补充一下,系统环境还是5.3的,所以traits就暂时用不了了,有没有什么变通的办法?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

百善笑为先 2022-09-02 15:56:31

这样?

trait T {
    private function mycall($var){
        return 'hello:'.str_pad($var, 4, '__', STR_PAD_LEFT);
    }
}

//invoke
class  A{
    use T {
        mycall as traitmycall;
    }

    public function mycall($val)
    {
        return $this->traitmycall($val);
    }
}

$obj = new A();
echo $obj->mycall('abc');
小猫一只 2022-09-02 15:56:31
class a
{
    function mycall($var)
    {
        $msg = 'hello:' . $var;
        $msg = $this->aftermycall($msg);
        return $msg;
    }

    function aftermycall($var)
    {
        $var .= 'aftermycall';
        return $var;
    }

}
$aobj = new a();
echo $aobj->mycall('abc');
内心荒芜 2022-09-02 15:56:31

使用 Traits需要注意优先级问题

简单 2022-09-02 15:56:31
class a
{
    function mycall($var)
    {
        $msg = 'hello:' . $var;
        $msg = $this->aftermycall($msg);
        return $msg;
    }

    function __call($method, $var)
    {
        echo __LINE__, PHP_EOL;
        // ....
    }

}
$aobj = new a();
echo $aobj->mycall('abc');

没有测试过

溺深海 2022-09-02 15:56:31
魔术方法,很容易实现。只需要将要监听的类设置为private就行
class a
{
    private function mycall($var)
    {
        return 'hello:'.$var;
    }

    function __call($method, $var)
    {
        if($method=='要监听的方法'){
            //这里处理$var
            //调用$this->$method($var)
            //处理返回结果并返回
        }else{
            //其他不需要监听的private方法
        }
    }

}
$aobj = new a();
echo $aobj->mycall('abc');
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文