variable variables и массивы

grigori

( ͡° ͜ʖ ͡°)
Команда форума
variable variables и массивы

Мне непонятно поведение PHP при работе с переменными переменными для доступа к элементам массива.

Правильно работающий код:
PHP:
$xxx = array("bcd"=>"some value");
$a = "xxx";
var_dump (${$a}['bcd']);
показывает, что ${$a}['bcd'] содержит "some value".

Код
PHP:
$xxx = array("bcd"=>"some value");
$a = "xxx";
var_dump ($$a['bcd']);
сообщает, что не определена переменная x (хотя $a =="xxx", а не "x")

PHP берет только первый символ из строкового значения переменной $a и ищет такую перменную.
Например:
PHP:
$x = array("bcd"=>"some value");
$a = "x";
var_dump ($$a['bcd']);
видим, что значением $$a['bcd'] является содержимое массива $x, a не элемента $x['bcd'].

Теперь, если вместо 'bcd' поставить число, PHP выдаст сообщение, что элемент не найден. Но любая строка просто игнорируется и возвращается не значение элемента, а весь массив.

Нормально:
PHP:
$x = array("bcd"=>"some value");
$a = "x";
var_dump ($$a[1]);
Указание элемента игнирируется:
PHP:
$x = array("bcd"=>"some value");
$a = "x";
var_dump ($$a["any string"]);
Платформа:
Linux 7.3, Apache 1,3.27 PHP 4.3.2

Может, я что-то не учел, и это фича?
 

tony2001

TeaM PHPClub
In order to use variable variables with arrays, you have to resolve an ambiguity problem. That is, if you write $$a[1] then the parser needs to know if you meant to use $a[1] as a variable, or if you wanted $$a as the variable and then the [1] index from that variable. The syntax for resolving this ambiguity is: ${$a[1]} for the first case and ${$a}[1] for the second.
взято отсюда: http://www.php.net/manual/en/language.variables.variable.php
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Это я читал. Первый код - как раз пример того, как пишется, чтоб не было проблем.

Но почему строковое значение игнорируется вообще, в то время, как числовое обрабатывается?
 

tony2001

TeaM PHPClub
>Но почему строковое значение игнорируется вообще, в то время, как числовое обрабатывается?
PHP:
$string = "xxx";
echo $$string[1]; // обращение к переменной, имя которой находится во второй букве ([1]) строки $string.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
спасибо, с числовым индексом понял

а в случае со строковым индексом идет преобразование в число, т.е. в 0, и соответственно берется первая буква.
Хм... не очевидно.
 
Сверху