Вызов метода класса - Ошибка Function name must be a string

Тема в разделе "PHP", создана пользователем Q_BASIC, 23 окт 2016.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    482
    Симпатии:
    1.184
    Приветствую,

    Код:
    PHP:
    $controller $route->get_controller();

    if(!
    $controller)
    {
        
    $hooks->call_hook('show_404');
        
    show_404();
    }

    var_dump($controller);

    $hooks->call_hook('start_step_1');

    $_CONTROLLER = new $controller['class'];

    $hooks->call_hook('start_step_2');

    var_dump($controller['function']);
    $_CONTROLLER->$controller['function']();

    $_CONTROLLER->__end();
    Вывод:
    Код:
    array(3) {
      ["file"]=>
      string(77) "/public_html/app/controllers/site.ru/welcome.php"
      ["class"]=>
      string(7) "welcome"
      ["function"]=>
      string(5) "index"
    }
    string(5) "index"
    
    Fatal error: Uncaught Error: Function name must be a string in /public_html/app/init.php:65
    Stack trace:
    #0 /public_html/index.php(40): require()
    #1 {main}
      thrown in /public_html/app/init.php on line 65
    Ошибка тут: $_CONTROLLER->$controller['function']();

    Говорит что там надо строку, как имя функции, но там и так строка (index).

    Что не так?
     
    dana77 нравится это.
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.611
    Симпатии:
    1.539
    Такой вызов применим только к 5 ветке:
    https://3v4l.org/DuLrp

    Можно выносить в переменную перед вызовом:
    PHP:
    $arr = array('fu' => 'bar');
    class 
    Fu {
      public function 
    bar() {
        return 
    __METHOD__;
      }
    }
    $fu = new Fu();
    $method $arr['fu'];
    var_dump(    $fu->$method()    ); //string(7) "Fu::bar"
    https://3v4l.org/5H9QQ

    Но еще лучше использовать call_user_func:
    PHP:
    $arr = array('fu' => 'bar');
    class 
    Fu {
      public function 
    bar() {
        return 
    __METHOD__;
      }
    }
    $fu = new Fu();

    var_dump(    call_user_func(array($fu$arr['fu']))     );
    https://3v4l.org/HHJfh
     
    Q_BASIC нравится это.
Статус темы:
Закрыта.