Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Удивительный PHP. продолжение диалога.

Неужели мой пример с
$test = ’Test’;
list ($a, $b) = $test;

не показался интересным? Скажите, а вы уверены, что преобразование string <-> обычно для PHP? array_reverse(’Test’) выдаст ошибку ’a’==array(’a’) и array(’a’)==’a’ выдаст false, а array(’a’).’’ выдаст «Array». Вот вам примеры, где не происходит взаимное преобразование этих двух типов. А вы рассуждаете так, будто это обычное дело и вы каждый день с этим сталкиваетесь.

Дополнение. Подумал и решил, что есть ещё способ преобразовать строку в массив:

$a = ’Test’;
settype($a, ’array’);
var_dump($a);

В этом случае мы получаем массив с элементом ’Test’, что противоречит теории, что в list происходит преобразование типов. Кстати:

$a = array(’a’,’b’,’c’);
settype($a, ’string’);
var_dump($a);

Выдаст notice: «Array to string conversion», что подтверждает, что преобразование строки в массив ничего общего с typeless PHP не имеет.

Ещё одно дополнение. list, по всей видимости, не выполняет преобразования, а просто умеет работать со строками. Аргументов тому два:
1) естественное для PHP преобразование string -> array это создать массив со строкой в качестве элемента этого массива, а не массив, где элементами будут буквы строки. Это легко увидеть, если использовать settype.
2) другое доказательство — следующий код:
$test = 411;
list ($a,$b) = $test;
в обеих переменных будет NULL. Сомневаюсь, что у list, если бы эта конструкция выполняла преобразование типов, было бы такое странное отношение к числам — выполнила бы преобразование и преобразовала число к массиву, как сделала это со строкой.

11 комментариев
zorgg 2004

Пристыдил.

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

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

;)

zorgg 2004

А, кстати. Такое отработает?

$a = array(1,2,3,4,5);
$a = ’Test’;
print_r(array_revers($a));

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

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

Нет, конечно. Предыдущая переменная $a просто потеряется. Вторая $a — это <b>совершенно</b> другая переменная и её тип, как и следует ожидать — string.

zorgg 2004

яссно.

laacz 2004

Вообшче PHP пробует кастит типы переменных только при операции присвоения. Id est:

list($a, $b) = $string; // type cast, присвоение
array_reverse($string); // еггог потому, что параметр функции должен быть массивом

Pardon my broken russian (typing).

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

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

wrong.
1) сходу могу вспомнить пару примеров преобразования вне присваивания: при операции сравнения так же происходит преобразование типов, $a = 4; var_dump($a.’a’) даст строку «4a».
2) list не выполняет преобразования. Легко убедиться (если посмотреть что со строкой делает settype), что естественное для PHP преобразование строки «Test» в массив — это сделать массив с элементом «Test», а вовсе не размазать буквы по массиву.

Вывод. List умеет работать со строками. Просто это никак не отражено в документации.

Ray 2004

«list, по всей видимости, не выполняет преобразования, а просто умеет работать со строками.»

Контраргумент:

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

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

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

Это не контраргумент. Попробуй «Test»{1}. Скажешь что получилось :)

mivlad 2004

А может, list внутри просто преобразуется в цикл, выполняющий что-то вроде $list_args[$i]=$rval[$i]?

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

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

Скорее всего что-то подобное и происходит.