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


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

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

var_dump($file0);

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

Author: John Slegers, 2012-02-13

7 answers

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

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

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


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

${'a' . 'b'} = 'hello there';
echo $ab; // hello there
 410
Author: Sarfraz, 2012-02-13 08:50:00

Обзор

В 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']()
 55
Author: John Slegers, 2016-08-01 13:21:55

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

${"file".$i} = file($filelist[$i]);
 17
Author: Joakim Johansson, 2012-02-13 08:36:17

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

Например,

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

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

Теперь я могу просто использовать $myfieldname (что проще в операторах echo и т. Д.), А не $myqueryresult['myfieldname']

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

 3
Author: Tom, 2013-01-16 06:03:13

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

$r = (object) $MyQueryResult;
echo $r->key;
 2
Author: corysus, 2013-05-30 19:14:11

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

if($_SERVER['REQUEST_METHOD']=='POST'){
    $r=0;
    for($i=1; $i<=4; $i++){
        $a = $_POST['a'.$i];
        $r .= $a;
    }
    echo $r;
}
 0
Author: Murad, 2015-05-12 16:58:42

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

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

${'comp_cat_'.$comp_cat.'_арр'}[1][0] = " ФРЕД БЛОГГС";

${'comp_cat_'.$comp_cat.'_арр'}[1][1] = $ файл_тиди;

Echo 'Первое значение массива '.$comp_cat_a_arr[1][0].' и второе значение .$comp_cat_a_arr[1][1];

 0
Author: M61Vulcan, 2015-11-10 20:38:30