У меня есть функция:

public function controller_instance($controller_name)
{
      $controller = Router::getRequestedController();
      return $controller instanceof $controller_name;

}

И я вызываю функцию как controller_instance('IndexController').

Это всегда возвращает false, потому что переменная $controller_name содержит строку IndexController.

Как я могу заставить это работать?

php
0
user1670773 14 Апр 2016 в 13:11

2 ответа

Лучший ответ

Просто создайте новый класс из этой строки контроллера

return $controller instanceof (new $controller_name());
2
Justinas 14 Апр 2016 в 10:13

Вы ожидаете экземпляр или логическое значение?

Создайте свойство массива в том же классе, где содержится метод controller_instance , и сохраните все экземпляры

private $controllers = array();

public function controller_instance($controller_name)
{
    if (isset($this->controllers[$controller_name])) {
        return $this->controllers[$controller_name];
    }
    return $this->controllers[$controller_name] = new $controller_name();
}

Пример 2: использование ReflectionClass и аргументов

private $controllers = array();

public function controller_instance($controller_name, Array $args = array())
{
    if (isset($this->controllers[$controller_name])) {
        return $this->controllers[$controller_name];
    }

    $class = new ReflectionClass($controller_name);

    $instance = $class->newInstanceArgs($args);

    return $this->controllers[$controller_name] = $instance;
}
0
Suzerain 14 Апр 2016 в 11:11