Когда использовать переменную переменную в PHP? - PullRequest
5 голосов
/ 16 июня 2009

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

Ответы [ 8 ]

9 голосов
/ 16 июня 2009

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

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

7 голосов
/ 16 июня 2009

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

6 голосов
/ 17 июня 2009

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

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

foreach($name in array('_GET','_POST','_REQUEST')) {
    array_map('stripslashes',$$name);
}
5 голосов
/ 17 июня 2009

Одной из ситуаций, в которой мне приходилось их использовать, является обработка 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

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

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

3 голосов
/ 01 мая 2015

Я нашел неплохой ..

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

2 голосов
/ 17 июня 2009

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

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

0 голосов
/ 17 июня 2009

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

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

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

0 голосов
/ 17 июня 2009

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

...