是否存在一种魔术方法,当从对象调用某个方法时,首先调用一个魔术方法。有点像__call方法,但只有在找不到方法时才会触发。
所以在我的情况下,我喜欢这样的事情:
class MyClass
{
public function __startMethod ( $method, $args )
{
// a method just got called, so this is called first
echo ' [start] ';
}
public function helloWorld ( )
{
echo ' [Hello] ';
}
}
$obj = new MyClass();
$obj->helloWorld();
//Output:
[start] [Hello]
PHP中是否存在类似的内容?
答案 0 :(得分:4)
没有直接的方法可以做到这一点,但在我看来,你试图实现一种面向方面的编程。有几种方法可以在PHP中实现这一点,一种方法是设置类如下所示:
class MyClass
{
public function __startMethod ( $method, $args )
{
// a method just got called, so this is called first
echo ' [start] ';
}
public function _helloWorld ( )
{
echo ' [Hello] ';
}
public function __call($method, $args)
{
_startMethod($method, $args);
$actualMethod = '_'.$method;
call_user_func_array(array($this, $actualMethod), $args);
}
}
$obj = new MyClass();
$obj->helloWorld();
查找在PHP中实现AOP的其他方法,看看什么最适合你(我会看看我是否可以在某处找到链接)。
编辑:这是给你的文件http://www.liacs.nl/assets/Bachelorscripties/07-MFAPouw.pdf
答案 1 :(得分:2)
没有没有神奇的方法。
您可以做的最好的事情是为您的函数创建其他名称(例如:hidden_helloWorld
),然后使用__call
捕获所有调用,并尝试调用{{ 1}}方法,如果它可用。当然,只有完全控制类及其父级的命名等,才有可能实现这一点......
答案 2 :(得分:1)
你可以通过使你的方法私有并使用__call()魔术方法调用方法来实现它。像:
<?php
class MyClass{
function __call($methd, $args){
if(method_exists($this, $mthd)){
$this->$mthd($args);
}
}
private function mthdRequired($args){
//do something or return something
}
除了使用call之外,mthdRequired方法不会被调用。我希望这很有用。