这一次,我面临一个非常奇怪的问题。我有以下代码:
$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(有2个可选参数)是$ className的方法。
但是,我很确定语法是正确的,当我尝试:$ obj-> $ method_name()我得到:
致命错误:方法名称必须是字符串
如果您有任何想法,请告诉我:) 提前致谢, 罗尔夫
答案 0 :(得分:2)
您遇到的问题可能是$ method_name不是字符串,但它包含将其转换为字符串(__toString()
)的方法。
由于in_array默认情况下不进行严格的类型比较,你会发现$method_name
可能是一个字符串,然后与方法名称进行比较,这可以解释为什么var_dump
输出为真。
您应该可以通过检查$method_name
echo gettype($method_name);
如果它不是字符串,解决方案是将变量置于字符串中,然后使用它来调用该函数。
$obj->{(string)$method_name}();
答案 1 :(得分:1)
最好使用call_user_func函数而不是$obj->$method_name()
来调用方法。
echo call_user_func(array($className, $method_name));