#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. я написал код на основе вашего ответа, спасибо! проверьте мою правку 🙂