Удивительный PHP. продолжение диалога.
$test = Test;
list ($a, $b) = $test;
не показался интересным? Скажите, а вы уверены, что преобразование string
Дополнение. Подумал и решил, что есть ещё способ преобразовать строку в массив:
$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, если бы эта конструкция выполняла преобразование типов, было бы такое странное отношение к числам выполнила бы преобразование и преобразовала число к массиву, как сделала это со строкой.
Пристыдил.
Комментарий для zorgg:
;)
А, кстати. Такое отработает?
$a = array(1,2,3,4,5);
$a = ’Test’;
print_r(array_revers($a));
Комментарий для zorgg:
Нет, конечно. Предыдущая переменная $a просто потеряется. Вторая $a — это <b>совершенно</b> другая переменная и её тип, как и следует ожидать — string.
яссно.
Вообшче PHP пробует кастит типы переменных только при операции присвоения. Id est:
list($a, $b) = $string; // type cast, присвоение
array_reverse($string); // еггог потому, что параметр функции должен быть массивом
Pardon my broken russian (typing).
Комментарий для laacz:
wrong.
1) сходу могу вспомнить пару примеров преобразования вне присваивания: при операции сравнения так же происходит преобразование типов, $a = 4; var_dump($a.’a’) даст строку «4a».
2) list не выполняет преобразования. Легко убедиться (если посмотреть что со строкой делает settype), что естественное для PHP преобразование строки «Test» в массив — это сделать массив с элементом «Test», а вовсе не размазать буквы по массиву.
Вывод. List умеет работать со строками. Просто это никак не отражено в документации.
«list, по всей видимости, не выполняет преобразования, а просто умеет работать со строками.»
Контраргумент:
list($a, $b, $c, $d) = «test»;
echo $a.$b.$c.$d;
Комментарий для Ray:
Это не контраргумент. Попробуй «Test»{1}. Скажешь что получилось :)
А может, list внутри просто преобразуется в цикл, выполняющий что-то вроде $list_args[$i]=$rval[$i]?
Комментарий для mivlad:
Скорее всего что-то подобное и происходит.