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

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

Related of "проверьте, существует ли функция в классе перед вызовом call_user_func ()"

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

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

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

или также:

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

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

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

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