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

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

$test = ’Test’;

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

10 марта 2004 13:37

zorgg (инкогнито)
10 марта 2004, 18:04

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

bolk (bolknote.ru)
10 марта 2004, 18:04, ответ предназначен zorgg

t s e T
:)

zorgg (инкогнито)
10 марта 2004, 18:26

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

bolk (bolknote.ru)
10 марта 2004, 18:26, ответ предназначен zorgg

Ага. И я:)

patrushev (инкогнито)
10 марта 2004, 19:58

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

bolk (bolknote.ru)
10 марта 2004, 19:58, ответ предназначен patrushev

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

zorgg (инкогнито)
10 марта 2004, 20:06

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

bolk (bolknote.ru)
10 марта 2004, 20:06, ответ предназначен zorgg

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

Яро (инкогнито)
10 марта 2004, 23:46

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

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

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

bolk (bolknote.ru)
10 марта 2004, 23:46, ответ предназначен Яро

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

Spectator (инкогнито)
11 марта 2004, 00:56

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

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

bolk (bolknote.ru)
11 марта 2004, 00:56, ответ предназначен Spectator

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

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

zorgg (инкогнито)
11 марта 2004, 09:47

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

bolk (bolknote.ru)
11 марта 2004, 09:47, ответ предназначен zorgg

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

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

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

Зебра (инкогнито)
11 марта 2004, 11:27

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

bolk (bolknote.ru)
11 марта 2004, 11:27, ответ предназначен Зебра

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

Зебра (инкогнито)
11 марта 2004, 11:40

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

bolk (bolknote.ru)
11 марта 2004, 11:40, ответ предназначен Зебра

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

Зебра (инкогнито)
11 марта 2004, 11:52

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

bolk (bolknote.ru)
11 марта 2004, 11:52, ответ предназначен Зебра

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

zorgg (инкогнито)
11 марта 2004, 11:55

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

bolk (bolknote.ru)
11 марта 2004, 11:55, ответ предназначен zorgg

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)