Как проверить, существует ли функция внутри класса, то есть внутри другого класса?

#php #class #error-handling #eval

#php #класс #обработка ошибок #вычисление

Вопрос:

у меня есть функция внутри класса, который находится внутри другого, таким образом, я могу организовать все мои «движки модуля» в разных папках и вызывать их функции.

Например, у меня есть модуль под названием ‘mdnewsletter‘, в этом модуле есть другие классы внутри, такие как: ‘setting’, ‘newsletter’ и т.д.

Обычно, если я не хочу получать переменные рассылки с идентификатором ‘5’, я делаю это:

 $res = $mdnewsletter->newsletter->get(5);
if($res===false) { /* error handler here */ }

/* otherwise, the code here */
  

Но теперь у меня есть модуль под названием ‘mdapi’. Предложение этого модуля заключается в безопасной загрузке движка другого модуля и выполнении команд только для модулей.

Мой вопрос по этому фрагменту кода:

             $response = @eval($eval);
            if($response===false amp;amp; ( $error = error_get_last() )){
                $this->error[] = "mdapi->exec() | A função fornecida não é uma função válida";
                $can_exec = false;
                $eval = '';
                $response = false;
            };
  

Как я получаю, строка выполнения имеет ‘mdnewsletter-> newsletter-> get’ и аргументы в другом var, которые я не могу использовать method_exists() . Я действительно предпочитаю читать код ошибки синтаксического анализа.

Если возникает ошибка синтаксического анализа, php-код зависает, и я не могу сообщить другой стороне, что код плохой или произошла ошибка.

Как я могу это исправить?

РЕДАКТИРОВАТЬ: Основываясь на Oktopus ответе, я написал код, который динамически проверяет все объекты, стоящие за функцией, а затем проверяет функцию с помощью последнего объекта, что-то вроде этого:

             // Avaliar se a primeira parte é uma class e os restantes funcoes
            $tmp = explode ('->', $tmp);

            // Verificar se são objectos até à função (ultima string)
            $obj = $$tmp[0];
            for($i=0;$i<count($tmp)-1;$i  ){
                if($i!=0){
                    $obj = $obj->$tmp[$i];
                }
                if(!is_object($obj)){
                    $this->error[] = "mdapi->exec() | A variavel '".$tmp[$i]."' não é um objecto!";
                    $can_exec = false;
                    $eval = '';
                    $response = false;
                }
            }

            // Verificar se a ultima variavel é uma função no ultimo objecto
            if(!is_callable(array($obj, $tmp[count($tmp) - 1]))){
                $this->error[] = "mdapi->exec() | A função pedida não foi encontrada no ultimo objecto!";
                $can_exec = false;
                $eval = '';
                $response = false;
            }
  

Ответ №1:

Я не буду вдаваться в «это может быть небезопасно», но вот как вы могли бы это сделать :

 //Exemple string : 
$parts = explode ('->', "object->property->testCall");
//How to test if it's callable
if (is_object($$parts[0]->$parts[1])){
    echo "it's an object";
    if (is_callable(array($$parts[0]->$parts[1], $parts[2]))){
        echo "it's callable";
    }
}
  

Комментарии:

1. можете ли вы объяснить, почему double $ ? я попытаюсь сейчас, чтобы

2. Это переменная variable: php.net/manual/en/language.variables.variable.php .

3. я написал код на основе вашего ответа, спасибо! проверьте мою правку 🙂