Php 动态方法调用的奇怪问题
这一次,我面临一个非常奇怪的问题。我有以下代码:Php 动态方法调用的奇怪问题,php,dynamic,methods,invocation,Php,Dynamic,Methods,Invocation,这一次,我面临一个非常奇怪的问题。我有以下代码: $xml = simplexml_load_file($this->interception_file); foreach($xml->children() as $class) { $path = str_replace('__CLASS_DIR__',CLASS_DIR,$class['path']); if(!is_file($path)) { throw new Exception('Bad co
$xml = simplexml_load_file($this->interception_file);
foreach($xml->children() as $class) {
$path = str_replace('__CLASS_DIR__',CLASS_DIR,$class['path']);
if(!is_file($path)) {
throw new Exception('Bad configuration: file '.$path.' not found');
}
$className = pathinfo($path,PATHINFO_FILENAME);
foreach($class as $method) {
$method_name = $method['name'];
$obj = new $className();
var_dump(in_array($method_name,get_class_methods($className)));exit;
echo $obj->$method_name();### not a method ???
}
}
如您所见,我从XML文件中获取类名和方法名。
我可以毫无问题地创建类的实例。末尾的var_dump返回true,这意味着$method_name(有两个可选参数)是$className的方法
但是,我确信语法是正确的,当我尝试:$obj->$method_name()时,我得到:
致命错误:方法名称必须是字符串
如果你有任何想法,请告诉我:)
提前感谢,,
Rolf您遇到的问题可能是$method\u name不是字符串,但它包含一个将其转换为字符串的方法(
\u toString()
)
与默认情况下的方法数组一样,不要进行严格的类型比较,您会发现$method\u name
可能是一个字符串,然后与方法名称进行比较,这就解释了var\u dump
输出true的原因
您应该能够通过检查$method\u name
echo gettype($method_name);
如果不是字符串,则解决方案是将变量大小写为字符串,然后使用该字符串调用函数
$obj->{(string)$method_name}();
您遇到的问题可能是$method\u name不是字符串,但它包含一个将其转换为字符串的方法(
\u\u toString()
)
与默认情况下的方法数组一样,不要进行严格的类型比较,您会发现$method\u name
可能是一个字符串,然后与方法名称进行比较,这就解释了var\u dump
输出true的原因
您应该能够通过检查$method\u name
echo gettype($method_name);
如果不是字符串,则解决方案是将变量大小写为字符串,然后使用该字符串调用函数
$obj->{(string)$method_name}();
最好使用call\u user\u func函数而不是
$obj->$method\u name()
来调用该方法
echo call_user_func(array($className, $method_name));
最好使用call\u user\u func函数而不是
$obj->$method\u name()
来调用该方法
echo call_user_func(array($className, $method_name));
嘿嘿嘿!那是宾果游戏实际上,$method_name是一个对象,与in_数组的严格比较返回false。非常感谢,Yacoby万岁!嘿嘿嘿!那是宾果游戏实际上,$method_name是一个对象,与in_数组的严格比较返回false。非常感谢,Yacoby万岁!