Как проверить, существует ли функция внутри класса, то есть внутри другого класса? - PullRequest
0 голосов
/ 26 мая 2011

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

Например, у меня есть модуль с именем ' 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;
            }

1 Ответ

1 голос
/ 26 мая 2011

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

//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";
    }
}
...