0

这一次,我面临一个非常奇怪的问题。我有以下代码:

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

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

如果您有任何想法,请告诉我 :) 提前谢谢,Rolf

4

2 回答 2

2

您遇到的问题可能是 $method_name 不是字符串,但它包含将其转换为字符串 ( __toString()) 的方法。

由于默认情况下 in_array 不进行严格的类型比较,您会发现它$method_name可能是一个字符串,然后与方法名称进行比较,这可以解释为什么var_dump输出为真。

您应该能够通过检查类型来确认这一点$method_name

echo gettype($method_name);

如果它不是字符串,解决方案是将变量大小写为字符串,然后使用它来调用函数。

$obj->{(string)$method_name}();
于 2010-04-23T11:54:47.153 回答
1

最好使用 call_user_func 函数而不是$obj->$method_name()调用方法。

echo call_user_func(array($className, $method_name));
于 2010-04-23T12:04:00.093 回答