动态方法调用的奇怪问题

时间:2010-04-23 11:52:57

标签: 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 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()我得到:

致命错误:方法名称必须是字符串

如果您有任何想法,请告诉我:) 提前致谢, 罗尔夫

2 个答案:

答案 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));