В следующем коде я вызываю класс с помощью 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
.
Есть ли функция, которая проверяет, существует ли в классе функция или есть другой способ, как я могу это проверить?
Вы ищете 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'; }