Использование фигурных скобок с динамическими именами переменных в PHP

191

Я пытаюсь использовать динамические имена переменных (я не уверен, как они на самом деле называются), но примерно так:

for($i=0; $i<=2; $i++) {
    $("file" . $i) = file($filelist[$i]);
}

var_dump($file0);

Возвращение nullговорит мне, что это не работает. Я понятия не имею, какой здесь синтаксис или техника, которую я ищу, что затрудняет исследование. $filelistопределяется ранее.

user1159454
источник
22
Не надо ! Нет веской причины использовать их. По сути, они просто неопрятный массив. Вместо этого используйте правильный массив.
Квентин
Хорошо, извините, я просто вернулся и выбрал ответ на каждый вопрос, который я задал до сих пор. Хорошо, что только 7: P
user1159454
2
И Квентин, почему они плохо практикуют ?? Я думаю, должна быть причина, по которой они существуют вместе с массивами
user1159454
@ user1159454 - Это беспорядок, в котором отсутствуют все инструменты, которые могут быть применены к доступным им массивам. Они существуют по причинам древнего наследия и безумных крайних случаев.
Квентин,
8
Сумасшедшие крайние случаи могут быть точно, почему кто-то хотел бы задать этот вопрос.
Винсент

Ответы:

512

Заверните их в {}:

${"file" . $i} = file($filelist[$i]);

Рабочий пример


Использование ${}- это способ создания динамических переменных, простой пример:

${'a' . 'b'} = 'hello there';
echo $ab; // hello there
Sarfraz
источник
4
Можно ли также создавать динамические массивы с той же логикой?
дтакис
У меня такое же сомнение в @dtakis, можете ли вы помочь нам? Если возможно, посмотрите на этот вопрос .
Марсио Маццукато
Просто сделайте предупреждение, если вы используете это для включения переменной (самый полезный способ ИМХО), не забудьте использовать двойные кавычки. ${'fixedTime$i'} = $row['timeInstance'];дает вам не очень полезные $fixedTime$iвместо того, чтобы $fixedTime1, $fixedTime2и т. д. (К счастью, заметил это почти сразу.)
BeNice
82

обзор

В PHP вы можете просто поставить дополнительный $перед переменной, чтобы сделать ее динамической переменной:

$$variableName = $value;

Хотя я бы не советовал, вы можете даже связать это поведение:

$$$$$$$$DoNotTryThisAtHomeKids = $value;

Вы можете, но не обязаны ставить $variableNameмежду {}:

${$variableName} = $value;

Использование {}обязательно только тогда, когда имя вашей переменной само по себе является композицией из нескольких значений, например так:

${$variableNamePart1 . $variableNamePart2} = $value;

Тем не менее рекомендуется всегда использовать {}, потому что это более читабельно.

Различия между PHP5 и PHP7

Еще одна причина, по которой всегда {}стоит использовать , заключается в том, что PHP5 и PHP7 имеют несколько иной способ работы с динамическими переменными, что в некоторых случаях приводит к разным результатам.

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

Случай 1 : $$foo['bar']['baz']

  • Интерпретация PHP5: ${$foo['bar']['baz']}
  • Интерпретация PHP7: ${$foo}['bar']['baz']

Случай 2: $foo->$bar['baz']

  • Интерпретация PHP5: $foo->{$bar['baz']}
  • Интерпретация PHP7: $foo->{$bar}['baz']

Случай 3: $foo->$bar['baz']()

  • Интерпретация PHP5: $foo->{$bar['baz']}()
  • Интерпретация PHP7: $foo->{$bar}['baz']()

Дело 4: Foo::$bar['baz']()

  • Интерпретация PHP5: Foo::{$bar['baz']}()
  • Интерпретация PHP7: Foo::{$bar}['baz']()
Джон Слегерс
источник
6
Хороший ответ на сомнительную тему. Я очень рад, что мне не нужно отлаживать такой код.
martinstoeckli
4
лучший ответ, так как он просто отвечает на вопрос, не будучи осуждающим
Rid Iculous
2
Да, у нас просто были проблемы с устаревшим кодом. Производство было PHP5.5, среда разработки была PHP7. Я одобряю этот вопрос.
Ожье Шелвис
20

Попробуйте использовать {}вместо ():

${"file".$i} = file($filelist[$i]);
Йоаким Йоханссон
источник
1
из руководства phpNET php.net/manual/ru/language.variables.variable.php $price_for_monday = 10; $price_for_tuesday = 20; $today = 'tuesday'; $price_for_today = ${ 'price_for_' . $today}; echo $price_for_today; // will return 20
Владимир Ч
5

Я делаю это довольно часто на результатах, возвращаемых из запроса ..

например

// $MyQueryResult is an array of results from a query

foreach ($MyQueryResult as $key=>$value)
{
   ${$key}=$value;
}

Теперь я могу просто использовать $ MyFieldname (что проще в выражениях echo и т. Д.) Вместо $ MyQueryResult ['MyFieldname']

Да, наверное, лень, но у меня никогда не было проблем.

Том
источник
14
Вы когда-нибудь пытались использовать функцию extract () PHP? php.net/manual/en/function.extract.php
DarkSide
1
удобный однострочный для наборов результатов БД: foreach ($ row as $ k => $ v) {$$ k = $ v}
Rid Iculous
2

Том, если у вас есть массив, вы можете преобразовать этот массив в объект и использовать его следующим образом:

$r = (object) $MyQueryResult;
echo $r->key;
corysus
источник
0

У меня есть решение для динамически созданного значения переменной и объединил все значения в переменной.

if($_SERVER['REQUEST_METHOD']=='POST'){
    $r=0;
    for($i=1; $i<=4; $i++){
        $a = $_POST['a'.$i];
        $r .= $a;
    }
    echo $r;
}
Murad
источник
0

Я был в положении, где у меня было 6 одинаковых массивов, и мне нужно было выбрать правильный в зависимости от другой переменной, а затем присвоить ей значения. В показанном здесь случае $ comp_cat был 'a', поэтому мне нужно было выбрать массив 'a' (у меня, конечно, также были массивы от 'b' до 'f')

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

$ {'comp_cat _'. $ comp_cat .'_ arr '} [1] [0] = "FRED BLOGGS";

$ {'comp_cat _'. $ comp_cat .'_ arr '} [1] [1] = $ file_tidy;

echo 'Первым значением массива является'. $ comp_cat_a_arr [1] [0]. ' и второе значение: $ comp_cat_a_arr [1] [1];

M61Vulcan
источник
0

Попробуйте использовать {} вместо ():

${"file".$i} = file($filelist[$i]);
Вильдан Бина
источник