Використання дужок з іменами динамічних змінних у PHP


191

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

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

var_dump($file0);

Повернення, nullяке говорить мені, що воно не працює. Я поняття не маю, що тут шукає синтаксис чи техніка, що ускладнює дослідження. $filelistвизначено раніше.


22
Не треба ! Ніколи не існує вагомих причин використовувати їх. Вони фактично є лише неохайним масивом. Використовуйте замість цього відповідний масив.
Квентін

Гаразд Вибачте, я просто повернувся назад і вибрав відповідь на кожне питання, яке я до цього часу задавав. Добре, що це лише 7: P
user1159454

2
А Квентін, чому вони погані практики ?? Має бути причина, що вони існують поряд з масивами, які я думаю
user1159454

@ user1159454 - Вони є неорганізованим безладом без усіх інструментів, які можна застосувати до доступних їм масивів. Вони існують з давніх спадкових причин і божевільних кейсів.
Квентін

8
Шалені крайові випадки можуть бути саме тому, хтось хотів би поставити це питання.
Вінсент

Відповіді:


512

Загорніть їх у {}:

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

Робочий приклад


Використання ${}- це спосіб створення динамічних змінних, простий приклад:

${'a' . 'b'} = 'hello there';
echo $ab; // hello there

4
Чи можливо також створювати динамічні масиви з однаковою логікою?
dtakis

У мене такі ж сумніви щодо @dtakis, чи можете ви нам допомогти? Якщо можливо, погляньте на це питання .
Marcio Mazzucato

Забезпечте попередження, якщо ви використовуєте це для включення змінної (найкорисніший спосіб IMHO), не забудьте використовувати подвійні лапки. ${'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
найкраща відповідь, оскільки він просто відповідає на питання, не будучи
судимим

2
Так, ми просто мали деякі проблеми зі спадковим кодом. Виробництво становило PHP5.5, середовище розробників - PHP7. Я підтримую це питання.
Ogier Schelvis


5

Я роблю це досить часто за результатами, поверненими з запиту ..

напр

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

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

Тепер я можу просто використовувати $ MyFieldname (що простіше в операторах ехо тощо), а не $ MyQueryResult ['MyFieldname']

Так, це, мабуть, ліниво, але я ніколи не мав жодних проблем.


14
Ви коли-небудь намагалися використовувати функцію extra () PHP? php.net/manual/en/function.extract.php
DarkSide

1
зручний
однолінійний

2

Том, якщо у вас є існуючий масив, ви можете перетворити цей масив в об’єкт і використовувати його так:

$r = (object) $MyQueryResult;
echo $r->key;

0

У мене є рішення для динамічно створеного змінного значення і об'єднало все значення в змінну.

if($_SERVER['REQUEST_METHOD']=='POST'){
    $r=0;
    for($i=1; $i<=4; $i++){
        $a = $_POST['a'.$i];
        $r .= $a;
    }
    echo $r;
}

0

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

Зауважте, що значення позиції змінної в масиві йдуть після дужки, що закривається.

$ {'comp_cat _'. $ comp_cat .'_ arr '} [1] [0] = "ФРЕДНІ БЛОГИ";

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

echo "Перше значення масиву". $ comp_cat_a_arr [1] [0]. " а друге значення - $ comp_cat_a_arr [1] [1];


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.