Проверьте, существует ли функция в классе перед вызовом 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.

Есть ли функция, которая проверяет, существует ли в классе функция или есть другой способ, как я могу это проверить?

Ответ 1

Вы ищете 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, которые предполагают, что вы не используете автозагрузчик .
Что еще: все, что вы делаете, это проверить file_exists, а не если класс уже загружен. Тогда ваш код будет генерировать фатальную ошибку, если на случай, если ваш фрагмент будет выполнен дважды с теми же значениями для $this->controller.
Начните исправлять это, по крайней мере, с помощью require на require_once...

Ответ 2

Вы можете использовать функцию php method_exists():

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

а также:

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

Ответ 3

Из PHP 5.3 вы также можете использовать

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

Ответ 4

Используйте 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';
}