32

在下面的代码中,我用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')时没有任何问题。但是当我调用一个不存在的函数时,它不起作用。现在我想在test调用函数之前先检查类中的函数是否存在call_user_func

是否有一个函数可以检查一个函数是否存在于一个类中,或者是否有另一种方法可以检查这个?

4

4 回答 4

61

您正在寻找method_exists初学者。但是您也应该检查该方法是否是callable。这是由有用的命名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.
至少通过将您的更改requirerequire_once...开始解决此问题

于 2013-10-23T09:11:55.793 回答
12

您可以使用 PHP 函数method_exists()

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

或者也:

if (method_exists($class_instance, 'method_name'))
call_user_func(etc...);
于 2013-10-23T09:06:55.637 回答
4

从 PHP 5.3 开始,您还可以使用:

if(method_exists($this, $model))
    return forward_static_call([$this, $model], $extra, $parameter);
于 2016-10-28T13:49:24.513 回答
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';
}
于 2013-10-23T09:09:10.040 回答