Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 动态方法调用的奇怪问题_Php_Dynamic_Methods_Invocation - Fatal编程技术网

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万岁!