32

In the following code I call a class with 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';
}

Let’s say that the controller has the following code.

class test {

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

}

When I call call_user_func('test', 'test_function') there isn't any problem. But when I call a function that does not exist, it does not work. Now I want to check first if the function in the class test does exist, before I call the function call_user_func.

Is there a function that checks if a function exists in an class or is there another way I can check this?

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呼び出しが含まれています。これは、オートローダーを使用していないことを示しています。さらに、クラスがすでにロードされているかどうかではなく、
check を実行しているだけです。file_existsしたがって、スニペットが の同じ値で 2 回実行される可能性がある場合、コードは致命的なエラーを生成します$this->controller
少なくとも、に変更して、これを修正し始めrequireますrequire_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 に答える