2013-12-09 103 views
3

在一个类中,我可以使用_callStatic函数在实际运行任何函数之前调用函数。但是,我还没有找到可以应用于父母的解决方案,并且会由子女继承。PHP:每次调用子类中的函数时调用函数

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

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

+1

'__call'不会被子类继承。在任何函数实际运行之前,它都不会运行。当您实际调用的函数不存在(或在该范围内不可访问)时会调用它。你的问题对我来说不是很清楚。你可以添加一些演示代码? –

回答

0

不幸的是,PHP中并没有神奇的方法,只要调用任何方法就会运行。

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

how to implement a decorator in PHP?

0

很难帮助你没有看到一些代码。但是,假设您不在子类中重新定义__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 
    } 
} 
1

只要你至少在PHP 5.4,你可以使用特质。 http://php.net/traits

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

+0

每次运行函数时,我都想记录它已经运行的事实,以及它的类,名称和参数。 – Ryan

+0

在整个应用程序?这也可以通过调用堆栈来实现。否则,这可能会非常困难,或者至少会打破一些“良好编码”的做法。我会考虑它,也许提供一些例子。 –

+0

是的,贯穿整个应用程序。我有一个主类有一些初始化函数,还有一些类扩展了主类,每个类都包含与不同目的相关的函数。 – Ryan