Когда использовать переменную переменную в PHP?

Я развиваюсь в PHP некоторое время, и у меня еще не было задачи, где мне приходилось использовать переменные переменные. Может ли кто-нибудь дать мне примеры, где их использовать - хорошая идея? Или они были включены в язык просто для удовольствия?

Ответ 1

Одна из ситуаций, когда я должен был их использовать, - это обработка URI, хотя этот метод может быть устаревшим, и я, по общему признанию, не использовал его в течение длительного времени.

Скажем, мы хотим вытащить URI из script в формате domain.tld/controller/action/parameter/s. Мы могли бы удалить имя script, используя следующее:

$uri_string = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']);

Чтобы извлечь контроллер, действие и значения параметров из этого, нам придется взорвать строку, используя разделитель пути '/'. Однако, если у нас есть ведущие или конечные разделители, при взрыве у нас будут пустые значения массива, поэтому мы должны обрезать их с начала и конца строки:

$uri_string = trim($uri_string, '/');

Теперь мы можем взорвать путь в массив:

$uri_data = explode('/', $uri_string);

$uri_data[0] теперь содержит наше имя контроллера, $uri_data[1] содержит имя действия, а значения в массиве, кроме этого, являются параметрами, которые должны быть переданы методу действия.

$controller_name = $uri_data[0];
$action_name = $uri_data[1];

Итак, теперь, когда у нас есть эти имена, мы можем использовать их для нескольких вещей. Если вы держите свои контроллеры в очень специфическом каталоге относительно корня сайта, вы можете использовать эту информацию для require_once класса контроллера. В этот момент вы можете создать экземпляр и вызвать его с помощью переменных переменных:

$controller = new $controller_name();
$controller->{$action_name}();    // Or pass parameters if they exist

В этом подходе есть много проблем с безопасностью, но это один из способов, с помощью которых я могу использовать переменные переменные.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ. Я не предлагаю использовать этот код на самом деле.

Ответ 2

Я обычно нахожу их в местах, где код плохо пахнет. Может быть, ссылки на статическую конфигурационную переменную и т.д. Но почему бы не использовать обычный ассоциативный массив? Похоже, что дыра в безопасности ждет.

Я полагаю, вы могли бы эффективно использовать их в шаблонах.

Ответ 3

Никогда не используйте их; "массив" всегда является лучшим решением.

Ответ 4

Во-первых, было бы опасно, если бы вы использовали пользовательский вывод для этих целей. Здесь используются только внутренние символы.

Учитывая это, я представляю это для вещей, таких как цикл через различные переменные или отправка переменных в качестве параметров.

foreach($name in array('_GET','_POST','_REQUEST')) {
    array_map('stripslashes',$$name);
}

Ответ 5

Не говоря уже о том, чтобы языки включали функции, которые вы не должны касаться bargepole (я даже задавал вопрос об этом некоторое время назад), а переменные переменные вероятно, одна из тех конструкций, которые попадают в эту категорию. Просто потому, что язык содержит функцию, не означает, что вы должны ее использовать.

Бывают случаи, когда они решают проблему (поскольку рекурсия редко используется на практике, но никто не будет утверждать, что это не существенная конструкция), но в целом любая функция языка, которая скрывает то, что делает ваш код, и переменные переменные вызывающе относиться к этой категории, следует относиться с особой осторожностью.

Ответ 6

Я нашел неплохую...

$php = "templates/php/default.php";
$html = "templates/html/default.php";
$css = "templates/css/default.php";
$js = "templates/js/default.php";

теперь я попросил пользователя сказать, какой файл ему нужен php или/и html..

$userarray = array("php", "css");
foreach($userarray as $file){
    var_dump($$file);
}

выход:

Шаблоны/PHP/default.php
Шаблоны/CSS/default.php

Я перекрестился с этим при попытке охвата статических переменных self::$file; вот так, я вспомнил, что могу использовать переменные переменные self::$$file;, который будет интерпретироваться как self::$php;

Ответ 7

Если вы не работаете с переменными глубины (которые вам не понадобятся, если вы ничего не делаете), вам, вероятно, не понадобятся. Даже тогда вы, вероятно, можете найти другой способ записать то же самое и получить тот же результат. Это может быть короче (и в некоторых случаях даже легче понять) использовать их, хотя, поэтому я рад, что он является частью языка.

Ответ 8

Я не нашел много применений переменных переменных, но использование переменных для методов может быть удобно, если только вы делаете это ясно. Например, в простой службе REST вы можете сделать что-то вроде этого:

$method = $request->getMethod(); // 'post','get','put','delete'
try 
{
    $response = $resource->$method($request->getInput());
}
catch (BadMethodException $badMethod)
{
    $response = $responseFactory->getError($badMethod);
}

Некоторые утверждают, что вы могли бы сделать это в равной степени с оператором switch (который вы могли бы), но таким образом поддается расширению (если вы решили добавить другой тип метода) и поддерживает абстракцию применения метода на ресурс.