Удивительный PHP
Только что нашёл. Попробуйте в PHP:
$test = Test;
list ($a, $b, $c, $d) = $test;
echo "$d $c $b $a";
Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.
$test = Test;
list ($a, $b, $c, $d) = $test;
echo "$d $c $b $a";
А что будет, у меня php под руками нет?:)
Комментарий для zorgg:
t s e T
:)
Ого! Вот уж никогда бы не подумал! :)
Комментарий для zorgg:
Ага. И я:)
Что-то я не понял, а в чем фишка?
Вполне очевидно, что «t s e T» получится.
Ведь любая строка — это массив.
Комментарий для patrushev:
Откуда это такой вывод, что любая строка — массив?
array_reverse(«Test») что по-твоему, выдаст?
patrushev: не порчай кайф. Чудо, чудо!
Комментарий для zorgg:
да он и не испортил. он неправ.
А к символам строки по типу
$mystring = ’Hello, world!’;
echo $mystring{1} . $mystring{4} . $mystring{6};
не пробовал обращаться?
Комментарий для Яро:
Ну и? Где смеяться? Я рассказываю о необычном применении list, а ты мне азы преподаёшь.
И я тоже не понял прикола.
$test=’test’;
echo $test[4],$test[3],$test[2],$test[1];
Комментарий для Spectator:
Я не ожидал такого поведения от list. В конце концов преобразование строки в массив — не слишком обычное явление для PHP.
В manual сказано: «list() only works on numerical arrays and assumes the numerical indices start at 0». Про строки там вообще ничего не сказано.
Ээ… PHP он как бы typeless, потому в этом случае происходит конвертация строки в массив. То есть строка она сама по себе не совсем массив, они даже от синтаксиса $a[i] отказались (сейчас нужно писать $a{i}, синтаксис с квадратными скобками остался только для обратной совместимости), однако если оператор «=» требует массива с правой стороны — будет ему массив.
Комментарий для zorgg:
Я всё это знаю. Но. Преобразование string -> array не самое обычное преобразование в PHP. array_reverse(’Test’) выдаст ошибку. Фокус с list, собственно, единственное место, где это происходит, по крайней мере я больше не помню примеров.
Другой пример. Вот это выдаст FALSE:
var_dump(’a’==array(’a’));
var_dump(array(’a’)==’a’);
Как сказанно в документации
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 как раз таки функция. внутри которой наверняка есть проверка на тип данных.
Комментарий для Зебра:
Ну и что? Преобразование string <-> array не является обычным для PHP. Других примеров, собственно, я не знаю. Лично я считаю, что преобразования не происходит, просто list умеет работать с переменными, содержащими строку, просто это не отражено в документации, как, например, долгое время не было отражено array(’a’)+array(’c’,’d’);
Таки я и не говорю что оно таковым является.
Просто list — это конструкция языка и реализована она Zend знает как — так что внутри неё могут быть какие угодно преобразования.
А про документацию это конечно верно. =)
Комментарий для Зебра:
А я что — спорю? Я нашёл интересное поведение. Что ты мне пытаешься доказать? :)
Кажется ровно тоже самое что и вы.
=)
Комментарий для Зебра:
В общем, мне кажется, что list может принимать на вход ещё и строку. Преобразования не происходит, просто list умеет работать ещё и со строками.
Ааа! Евгений людям тыкает. Апокалипсис не загорами. :)
Комментарий для zorgg:
Это интернет. Тут так принято.