我想检查一个函数是否存在于我正在创建的库中,这是静态的.我见过函数和method_exists,但是没有找到允许我在相对上下文中调用它们的方法.这是一个更好的例子:
class myClass{
function test1()
{
if(method_exists("myClass", "test1"))
{
echo "Hi";
}
}
function test2()
{
if(method_exists($this, "test2"))
{
echo "Hi";
}
}
function test3()
{
if(method_exists(self, "test3"))
{
echo "Hi";
}
}
}
// Echos Hi
myClass::test1();
// Trys to use 'self' as a string instead of a constant
myClass::test3();
// Echos Hi
$obj = new myClass;
$obj->test2();
Run Code Online (Sandbox Code Playgroud)
如果函数存在,我需要能够使测试3回显Hi,而不需要将其从静态上下文中取出.鉴于访问该类的关键字应该是'self',因为$ this用于指定的类.
检查ia函数存在时遇到问题 - 我知道function_exists()和method_exists()但是无法获得我寻找的功能
我通过套接字连接传递函数,如$ MM-> Player-> Play().之后我评估它们并通过套接字连接返回结果.
我做过滤功能(必须从$ MM开始,其他任何东西都将被拒绝),但我无法获取我的代码来检查函数是否存在.这很重要,因为如果函数不存在,服务器将崩溃.
任何人都知道这个解决方案?
提前致谢.
代码:
$MM = new SDBApplication;
在SDBApplication的构造函数中:
$this->Player = new SDBPlayer;
我尝试了以下方法来检查:代码:
method_exists($MM, "Player::Play");
function_exist("$MM->Player->Play);
即使函数存在,它们都返回false
解决方案
$parts = explode('->', $string);
$numParts = count($parts)-1;
$object = '$MM';
for($i=0; $i < $numParts; $i++){
$object .= '->'.$parts[$i];
}
$parts[$numParts+1] = preg_replace('(\\(.*\\))', '', $parts[$numParts]);
eval( '$check = method_exists('.$object.', '.$parts[$numParts+1].');');
Run Code Online (Sandbox Code Playgroud)
它需要进行评估,因为输入是一个字符串.