在调用call_user_func()之前检查类中是否存在函数

时间:2013-10-23 09:04:47

标签: php

在下面的代码中,我使用call_user_func()调用了一个类。

if(file_exists('controller/' . $this->controller . '.controller.php')) {
    require('controller/' . $this->controller . '.controller.php');
    call_user_func(array($this->controller, $this->view));
} else {
    echo 'error: controller not exists <br/>'. 'controller/' . $this->controller . '.controller.php';
}

让我们说控制器有以下代码。

class test {

    static function test_function() {
        echo 'test';
    }

}

当我致电call_user_func('test', 'test_function')时,没有问题。但是,当我调用一个不存在的函数时,它不起作用。现在我想在调用函数call_user_func之前先检查te类测试中的函数是否存在。

是否有一个函数可以检查类中是否存在函数,还是有其他方法可以检查这个函数?

4 个答案:

答案 0 :(得分:46)

你正在寻找method_exists首发。但是你应该检查的内容是否是可调用的。这是通过名为is_callable的有用功能完成的:

if (method_exists($this->controller, $this->view)
    && is_callable(array($this->controller, $this->view)))
{
    call_user_func(
        array($this->controller, $this->view)
    );
}

但这只是事情的开始。您的代码段中包含明确的require来电,表示您没有使用autoloader 更重要的是:您所做的只是检查file_exists,而不是该类已经加载。那么,如果您的代码段被$this->controller的相同值一次性执行两次,那么您的代码将产生致命错误。
通过将require更改为require_once ...

,至少可以开始修复此问题

答案 1 :(得分:10)

您可以使用php函数method_exists()

if (method_exists('ClassName','method_name'))
call_user_func(etc...);

或者:

if (method_exists($class_instance,'method_name'))
call_user_func(etc...);

答案 2 :(得分:3)

从PHP 5.3开始,您也可以使用

if(method_exists($this, $model))
    return forward_static_call([$this, $model],$extra, $parameter);

答案 3 :(得分:0)

使用method_exists($this->controller, $this->view)。以你的例子:

if(file_exists('controller/' . $this->controller . '.controller.php') && 
   method_exists($this->controller,$this->view)) {

    require('controller/' . $this->controller . '.controller.php');
    call_user_func(array($this->controller, $this->view));

} else {
    echo 'error: controller or function not exists <br/>'. 'controller/' . $this->controller . '.controller.php';
}