2013-10-23 91 views
15

在下面的代码中,我调用了一个类call_user_func()在调用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')没有问题。但是,当我调用一个不存在的函数时,它不起作用。现在我想首先检查te类测试中的函数是否存在,然后再调用函数call_user_func

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

+7

[method_exists()](http://php.net /manual/en/function.method-exists.php) –

+0

谢谢@MarkBaker! –

+2

不是每个现有的方法都可以调用 - > [is_callable](http://php.net/manual/en/function.is-callable.php) – a4c8b

回答

39

您正在寻找初学者的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,那么你的代码将会产生一个致命错误。
开始解决这个由,在最起码,改变你的requirerequire_once ...

+0

关于'is_callable'的TIL,谢谢! –

+0

如果你正在调用'is_callable()',你需要调用'method_exists()'吗? – MrWhite

+2

@ w3d:'is_callable'理论上可以返回'true',即使你没有调用方法(关闭分配给属性)。做这两项检查可能是一种偏执狂,但这是最安全的方式。此外,最后我检查了'method_exists'表现更好,所以如果返回false,'is_callable'将不会被调用(微优化,我知道,但仍然...)。但这并不是说你没有意见,但我认为这两种功能都值得在这方面提及...... –

9

您可以使用PHP函数method_exists()

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

,或者也:

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

伟大它使你的理解变得非常简单。 –

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'; 
} 
+1

尽管您需要调用'method_exists()'_after_包含类文件。 – MrWhite

3

从PHP 5.3,你也可以使用

if(method_exists($this, $model)) 
    return forward_static_call([$this, $model],$extra, $parameter); 
相关问题