我试图在反射类中找到一个魔术方法的检查,但它不在那里。也许php(我使用的是php 5.3)还有其他一些工具可以解决这个问题吗?像这样:
class myClass {
public function __call($method, $arguments)
{
return 'is magic';
}
public function notMagic()
{
return 'not a magic';
}
}
$reflection = new ReflectionMethod('myClass', 'magic');
if ($reflection->isMagic())
{
/* do something if is magic*/
}
答案 0 :(得分:5)
由于PHP没有提供检查方法是否具有魔力的方法,因此您有两种选择。
文档说
PHP将所有以__开头的函数名称保留为神奇的。它是 建议您不要在PHP中使用带__的函数名,除非 你想要一些记录在案的神奇功能。
因此,您只需检查方法名称是否以__
开头:
if(strpos($methodName, '__') === 0){
echo "$methodName is magic";
}
这样做的缺点是有人可以制作一个方法__myNewMethod
,尽管PHP实际上没有对它做任何事情,但它会被认为是神奇的。
或者,您可以拥有名称的白名单。同样,根据文档,以下方法是神奇的:
__construct(), __destruct(), __call(), __callStatic(),
__get(), __set(), __isset(), __unset(), __sleep(),
__wakeup(), __toString(), __invoke(), __set_state() and __clone()
此方法的缺点是PHP的未来版本可能会在此列表中添加和删除,从而导致代码不正确。
选择可能取决于您希望如何使用此信息。