Странная проблема с динамическим вызовом метода - PullRequest
0 голосов
/ 23 апреля 2010

на этот раз я столкнулся с действительно странной проблемой. У меня есть следующий код:

$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

Ответы [ 2 ]

2 голосов
/ 23 апреля 2010

Возможно, проблема в том, что $ method_name не является строкой, но содержит метод для преобразования его в строку (__toString()).

Поскольку in_array по умолчанию не выполняет строгие сравнения типов, вы обнаружите, что $method_name, вероятно, требуется строка и затем сравнивается с именами методов, что объясняет, почему var_dump выводит true.

Вы сможете подтвердить это, проверив тип $method_name

echo gettype($method_name);

Если это не строка, решение состоит в том, чтобы поместить переменную в строку, а затем использовать ее для вызова функции.

$obj->{(string)$method_name}();
1 голос
/ 23 апреля 2010

Лучше использовать функцию call_user_func вместо $obj->$method_name() для вызова метода.

echo call_user_func(array($className, $method_name));
...