У меня есть функция внутри класса, которая находится внутри другого, таким образом, я могу организовать все «модули» моего модуля в разных папках и вызывать их функции.
Например, у меня есть модуль с именем ' 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 && ( $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 зависнет, и я не смогу сообщить другой стороне, что код плохой или произошла ошибка.
Как я могу это исправить?
EDIT:
Основываясь на ответе 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;
}