Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

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

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

$test = ’Test’;

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

22 комментария
zorgg 2004

А что будет, у меня php под руками нет?:)

Евгений Степанищев (bolknote.ru) 2004

Комментарий для zorgg:

t s e T
:)

zorgg 2004

Ого! Вот уж никогда бы не подумал! :)

Евгений Степанищев (bolknote.ru) 2004

Комментарий для zorgg:

Ага. И я:)

patrushev 2004

Что-то я не понял, а в чем фишка?
Вполне очевидно, что «t s e T» получится.
Ведь любая строка — это массив.

Евгений Степанищев (bolknote.ru) 2004

Комментарий для patrushev:

Откуда это такой вывод, что любая строка — массив?
array_reverse(«Test») что по-твоему, выдаст?

zorgg 2004

patrushev: не порчай кайф. Чудо, чудо!

Евгений Степанищев (bolknote.ru) 2004

Комментарий для zorgg:

да он и не испортил. он неправ.

Яро 2004

А к символам строки по типу

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

не пробовал обращаться?

Евгений Степанищев (bolknote.ru) 2004

Комментарий для Яро:

Ну и? Где смеяться? Я рассказываю о необычном применении list, а ты мне азы преподаёшь.

Spectator 2004

И я тоже не понял прикола.

$test=’test’;
echo $test[4],$test[3],$test[2],$test[1];

Евгений Степанищев (bolknote.ru) 2004

Комментарий для Spectator:

Я не ожидал такого поведения от list. В конце концов преобразование строки в массив — не слишком обычное явление для PHP.

В manual сказано: «list() only works on numerical arrays and assumes the numerical indices start at 0». Про строки там вообще ничего не сказано.

zorgg 2004

Ээ… PHP он как бы typeless, потому в этом случае происходит конвертация строки в массив. То есть строка она сама по себе не совсем массив, они даже от синтаксиса $a[i] отказались (сейчас нужно писать $a{i}, синтаксис с квадратными скобками остался только для обратной совместимости), однако если оператор «=» требует массива с правой стороны — будет ему массив.

Евгений Степанищев (bolknote.ru) 2004

Комментарий для zorgg:

Я всё это знаю. Но. Преобразование string -> array не самое обычное преобразование в PHP. array_reverse(’Test’) выдаст ошибку. Фокус с list, собственно, единственное место, где это происходит, по крайней мере я больше не помню примеров.

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

var_dump(’a’==array(’a’));
var_dump(array(’a’)==’a’);

Зебра 2004

Как сказанно в документации
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 как раз таки функция. внутри которой наверняка есть проверка на тип данных.

Евгений Степанищев (bolknote.ru) 2004

Комментарий для Зебра:

Ну и что? Преобразование string <-> array не является обычным для PHP. Других примеров, собственно, я не знаю. Лично я считаю, что преобразования не происходит, просто list умеет работать с переменными, содержащими строку, просто это не отражено в документации, как, например, долгое время не было отражено array(’a’)+array(’c’,’d’);

Зебра 2004

Таки я и не говорю что оно таковым является.
Просто list — это конструкция языка и реализована она Zend знает как — так что внутри неё могут быть какие угодно преобразования.
А про документацию это конечно верно. =)

Евгений Степанищев (bolknote.ru) 2004

Комментарий для Зебра:

А я что — спорю? Я нашёл интересное поведение. Что ты мне пытаешься доказать? :)

Зебра 2004

Кажется ровно тоже самое что и вы.
=)

Евгений Степанищев (bolknote.ru) 2004

Комментарий для Зебра:

В общем, мне кажется, что list может принимать на вход ещё и строку. Преобразования не происходит, просто list умеет работать ещё и со строками.

zorgg 2004

Ааа! Евгений людям тыкает. Апокалипсис не загорами. :)

Евгений Степанищев (bolknote.ru) 2004

Комментарий для zorgg:

Это интернет. Тут так принято.