PHP:每当调用子类中的函数时调用函数

Posted

技术标签:

【中文标题】PHP:每当调用子类中的函数时调用函数【英文标题】:PHP: Calling a function whenever a function in a child class is called 【发布时间】:2013-12-27 04:54:54 【问题描述】:

在单个类中,我可以使用 _call/_callStatic 函数在任何函数实际运行之前调用函数。但是,我还没有找到可以应用于父级的解决方案,并且它将由子级继承。

我能想到的唯一方法是在每个调用父类中的函数的类中放入一小段代码,其中包含我的代码。

有没有更好的解决方案可以实施?

【问题讨论】:

__call 确实被子类继承。并且它不会在“任何功能实际运行之前”运行。当您实际调用的函数不存在(或在该范围内不可访问)时,将调用它。你的问题对我来说不是很清楚。你能添加一些演示代码吗? 【参考方案1】:

只要您至少在 php 5.4 上,您就可以使用特征。 http://php.net/traits

这将需要在您的代码中进行一些调整,但可能会允许所需的行为。 你有更多关于你的用例的信息吗?我想根据你的描述记录,这​​样正确吗?

【讨论】:

每次运行函数时,我都想记录它已经运行的事实,以及它的类、名称和参数。 整个应用程序?这也可以通过调用堆栈实现。否则,它可能会非常困难,或者至少会破坏一些“良好的编码”实践。我会考虑一下,也许会提供一些例子。 是的,贯穿整个应用程序。我有一个具有一些初始化功能的主类,以及一些扩展该主类的类,每个类都包含与不同目的相关的功能。【参考方案2】:

不幸的是,PHP 中没有神奇的方法可以在任何方法被调用时运行。

我认为您正在寻找的解决方案是装饰器,有关在 PHP 中装饰方法/类的技巧,请参阅这篇文章。

how to implement a decorator in PHP?

【讨论】:

【参考方案3】:

如果不看一些代码,很难为您提供帮助。但是,假设您没有在子类中重新定义__call/__callStatic,它应该只是从它的超类继承方法。

如果您这样做在子类中重新定义__call/__callStatic,它将覆盖超类的定义。所以你必须以某种方式调用超类的方法。为此,您可以使用parent 关键字。看这个例子:

class SuperClass

    public function __call($name, $arguments)
    
        // Do some stuff
    


class SubClass extends SuperClass

    public function __call($name, $arguments)
    
        // Execute the parent's __call() method
        return parent::__call($name, $arguments);

        // Do some extra stuff here
    

【讨论】:

以上是关于PHP:每当调用子类中的函数时调用函数的主要内容,如果未能解决你的问题,请参考以下文章

在不处理指针时调用子类(虚拟)函数(后期绑定)

配置dynamoDb流仅在删除时调用lambda函数

Python中子类怎样调用父类方法

每当我的 Apollo 订阅在 React 中被触发时,我如何调用函数?

php中的魔术方法(Magic methods)和魔术常亮

Flutter Provider - 在值更改时调用函数而不调用 build()