如何检查它的魔法?

qwe*_*ukg 5 php reflection magic-methods

我试图在反射类中找到一个魔术方法的检查,但它不存在.也许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*/
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*Jim 5

由于PHP没有提供检查方法是否具有魔力的方法,因此您有两种选择.

文档说

PHP保留所有以__开头的函数名称作为魔法.除非您需要一些记录的魔术功能,否则建议您不要在PHP中使用带__的函数名.

因此,您可以检查方法名称是否以以下内容开头__:

if(strpos($methodName, '__') === 0){
    echo "$methodName is magic";
}
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是有人可以制作一个方法__myNewMethod,尽管PHP实际上没有做任何事情,但它会被认为是神奇的.

或者,您可以使用名称白名单.同样,根据文档,以下方法是神奇的:

__construct(), __destruct(), __call(), __callStatic(), 
__get(), __set(), __isset(), __unset(), __sleep(), 
__wakeup(), __toString(), __invoke(), __set_state() and __clone() 
Run Code Online (Sandbox Code Playgroud)

这种方法的缺点是PHP的未来版本可能会在此列表中添加和删除,从而导致代码不正确.

选择可能取决于您希望如何使用此信息.

PHP魔术方法