oop — Странный вызов метода php

Я сталкиваюсь со странным способом вызова метода для объекта.

$controller->{ $action }();

Но если я уберу фигурные скобки, звонок все равно будет работать. Кто-то знает, что означают эти фигурные скобки?

Текущий контекст

<?php
function call($controller, $action) {
// require the file that matches the controller name
require_once('controllers/' . $controller . '_controller.php');

// create a new instance of the needed controller
switch($controller) {
case 'pages':
$controller = new PagesController();
break;
}

// call the action
$controller->{ $action }();
}

// just a list of the controllers we have and their actions
// we consider those "allowed" values
$controllers = array('pages' => ['home', 'error']);

// check that the requested controller and action are both allowed
// if someone tries to access something else he will be redirected to the error action of the pages controller
if (array_key_exists($controller, $controllers)) {
if (in_array($action, $controllers[$controller])) {
call($controller, $action);
} else {
call('pages', 'error');
}
} else {
call('pages', 'error');
}
?>

ОБНОВИТЬ

$ controller и $ action — это переменные, унаследованные от файла index.php, который требует этого. Так как унаследованные переменные они полностью доступны.

Вот index.php

//  set default controller and action
$controller =   'login';
$action     =   'index';

//  check if $_GET variables are set
if(isset($_GET['controller']) && $_GET['action'])
{
//  if we have something set in here we override the default value
$controller = $_GET['controller'];
$controller = $_GET['action'];
}

//  now we require the router file who will read the $controller and $action vars.
require_once '../app/core/Router.php';

2

Решение

Когда Дагон связал вас, имя метода в этом примере переменная переменная.

Скобки не требуются, если вы просто используете имя переменной самостоятельно, однако, если вы хотите объединить строку в имя переменной, вам понадобятся скобки, например:

// These are the same:
$controller->$action();
$controller->{$action}();

// This won't work:
$controller->custom$action();
// This will work:
$controller->{'custom' . $action}();

$action в вашем примере представляет имя метода, например, Runчтобы ты мог бежать $controller->customRun(),

В вашем контексте это абстрактный способ вызова действия контроллера, основанный на предоставлении $controller а также $action,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]