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

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

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

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

 $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 

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

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

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

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

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

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

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

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

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

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

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

 $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;

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

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

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

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