Удивительный PHP

Только что нашёл. Попробуйте в PHP:

$test = ’Test’;

list ($a, $b, $c, $d) = $test;
echo «$d $c $b $a»;

Комментарии 22

patrushev № 5
Что-то я не понял, а в чем фишка?
Вполне очевидно, что «t s e T» получится.
Ведь любая строка — это массив.
Евгений Степанищев автор № 6
Откуда это такой вывод, что любая строка — массив?
array_reverse(«Test») что по-твоему, выдаст?
Яро № 9
А к символам строки по типу

$mystring = ’Hello, world!’;
echo $mystring{1} . $mystring{4} . $mystring{6};

не пробовал обращаться?
Евгений Степанищев автор № 10
Ну и? Где смеяться? Я рассказываю о необычном применении list, а ты мне азы преподаёшь.
Spectator № 11
И я тоже не понял прикола.

$test=’test’;
echo $test[4],$test[3],$test[2],$test[1];
Евгений Степанищев автор № 12
Я не ожидал такого поведения от list. В конце концов преобразование строки в массив — не слишком обычное явление для PHP.

В manual сказано: «list() only works on numerical arrays and assumes the numerical indices start at 0». Про строки там вообще ничего не сказано.
zorgg № 13
Ээ… PHP он как бы typeless, потому в этом случае происходит конвертация строки в массив. То есть строка она сама по себе не совсем массив, они даже от синтаксиса $a[i] отказались (сейчас нужно писать $a{i}, синтаксис с квадратными скобками остался только для обратной совместимости), однако если оператор «=» требует массива с правой стороны — будет ему массив.
Евгений Степанищев автор № 14
Я всё это знаю. Но. Преобразование string -> array не самое обычное преобразование в PHP. array_reverse(’Test’) выдаст ошибку. Фокус с list, собственно, единственное место, где это происходит, по крайней мере я больше не помню примеров.

Другой пример. Вот это выдаст FALSE:

var_dump(’a’==array(’a’));
var_dump(array(’a’)==’a’);
Зебра № 15
Как сказанно в документации
Like array(), this is not really a function, but a language construct. list() is used to assign a list of variables in one operation.
а вот array_reverse как раз таки функция. внутри которой наверняка есть проверка на тип данных.
Евгений Степанищев автор № 16
Ну и что? Преобразование string <-> array не является обычным для PHP. Других примеров, собственно, я не знаю. Лично я считаю, что преобразования не происходит, просто list умеет работать с переменными, содержащими строку, просто это не отражено в документации, как, например, долгое время не было отражено array(’a’)+array(’c’,’d’);
Зебра № 17
Таки я и не говорю что оно таковым является.
Просто list — это конструкция языка и реализована она Zend знает как — так что внутри неё могут быть какие угодно преобразования.
А про документацию это конечно верно. =)
Евгений Степанищев автор № 18
А я что — спорю? Я нашёл интересное поведение. Что ты мне пытаешься доказать? :)
Зебра № 19
Кажется ровно тоже самое что и вы.
=)
Евгений Степанищев автор № 20
В общем, мне кажется, что list может принимать на вход ещё и строку. Преобразования не происходит, просто list умеет работать ещё и со строками.