帮助PHP method_exists()

时间:2009-09-15 00:48:57

标签: php methods kohana

我正在为ajax的控制器编写一个“全部捕获”方法。它被称为'ajax':P

这就是目前的样子

public function ajax($method = null) {

    if ( ! $method OR ! request::is_ajax()) {

        return false;

    }


    if (method_exists(array($this, 'searchModel'), $method)) {
        echo $this->searchModel->$method();

    }

    exit;



}

如果不明显,我希望ajax在认为它不是Ajax请求时首先挽救,然后检查我的$this->searchModel以查看它是否具有传入的方法ajax方法的论证。

如果确实找到了该方法,它应该回显它的返回值,然后退出。

我的问题是我无法让method_exists()找到方法!我知道它确实存在...我甚至硬编码(用于测试目的)我知道的方法确实存在。

这让我有点疯狂,是否有人能够告诉我我做错了什么?

谢谢!

P.S。我正在使用Kohana框架,但我认为这不重要。

更新

您认为将我的内部方法名称暴露给JavaScript(即公开)可能会引起安全问题吗?

2 个答案:

答案 0 :(得分:4)

您正在使用method_exists()的第一个参数,就好像它支持回调参数,但它不接受回调。它只接受一个对象实例或一个类名(一个字符串)来测试静态方法。

试试这个:

if (method_exists($this->searchModel, $method)) {
    echo $this->searchModel->$method();
}

回答你的第二个问题,是的,我认为这是一个安全问题。您尚未确认请求格式正确。我不会使用您正在设计的“全能”解决方案。

答案 1 :(得分:2)

我认为您的代码应该说:

if(method_exists($this->searchModel, $method))
    echo $this->searchModel->$method();

然而, 将searchModel对象的所有方法暴露给世界是一个坏主意,所以你应该在ajax方法前加上“ajax_”或类似的东西,以便只能使用该前缀调用方法:

// given that $method is 'user_login' ...
$realMethod = 'ajax_' . $method;    
if(method_exists($this->searchModel, $realMethod))
    // calls $this->searchModel->ajax_user_login();
    echo $this->searchModel->$realMethod();