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

5

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

$ foo = 42; $ bar = & quot; foo & quot ;; $$ bar == & gt; 42 jrockway
Я лишь изредка использую PHP ... что за хрень & quot; переменная переменная & quot; в PHP? Evan Teran

Ваш Ответ

8   ответов
2

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

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

7

& quot; массив & quot; всегда лучшее решение.

Error: User Rate Limit ExceededAnyError: User Rate Limit Exceeded
3

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

выход:

templates/php/default.php
templates/css/default.php

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

6

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

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

foreach($name in array('_GET','_POST','_REQUEST')) {
    array_map('stripslashes',$$name);
}
Error: User Rate Limit Exceeded
9

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

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

0

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

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

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

5

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

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

DISCLAIMERЯ не предлагаю вам использовать этот код.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

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

Похожие вопросы