php - 如何检查一个类中的函数是否存在于另一个类中?

标签 php class error-handling eval

我在另一个类内部有一个函数,这样我可以将我所有的“模块引擎”组织在不同的文件夹中,并将它们称为函数。

例如,我有一个名为“”的模块mdnewsletter ',即 模块内有其他类 比如:“设置”、“时事通讯”等。

通常,如果我不想获得 id '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 代码将挂起,我无法通知对方代码错误或发生错误。

我怎样才能解决这个问题?

编辑:
基于 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;
            }

最佳答案

我不会说“这可能是不安全的事情”,但是您可以这样做:

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

关于php - 如何检查一个类中的函数是否存在于另一个类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6137936/

相关文章:

php - 在 PHP 中与 memcached 的持久连接

php - SQL Select 上的循环

javascript - 我无法访问类中的方法

error-handling - try/catch block 如何实现?

windows - windows .BAT错误系统找不到指定的路径

ruby-on-rails - 根据find_or_create做出决策

php - Laravel - 方法 Illuminate\Http\Request::request 不存在

php - mysql date add 或 date sub with variable?

c++ - 映射、类、成员函数

c++ - 类中 vector 的删除-删除习语问题