Головокружительный код или как сносить крышечки

Major

Новичок
Головокружительный код или как сносить крышечки

PHP:
<?php

$a = (array) 'A';

$b = &$a[0];

$c = $a;

$c[0] = 'C';

var_dump($a); // Что тут будет и почему?
?>
 

Major

Новичок
Ну и соответственно не забудте еще потом сравнить с

PHP:
<?php

$a = (array) 'A';

/* $b = &$a[0]; */

$c = $a;

$c[0] = 'C';

var_dump($a); // Что тут будет и почему?
?>
 

Денч

Новичок
Ща придет Tony2001 и скажет, что это такая фича, чтоб нескучно работать было
 

fixxxer

К.О.
Партнер клуба
Думаю, он скажет что надо писать багрепорт, и вобщем то правильно скажет :)
 

Major

Новичок
Эта штука пашет во всей серии 5х . Что 5.3, что 5.2

А может не надо багрепорт? Я вот уже придумал как эту фичу на практике юзать...
 

Major

Новичок
Вот пишу я код усердно, выкладываюсь, а меня потом наъ][Yй посылают... Ну не буду же я опускаться до уровня посылающего в ответ его посылать... Я в коде сделаю такие штуки и пусть е6е+ся с проектом сам...

Ну это я утрированно, но суть понятна... Ну еще есть всякие 1ые апреля и все такое...
 

WebAngel

Новичок
нуда, после такого трюка $b = &$a[0]; , когда оно уже не нужно, необходимо делать unset($b);
 

fixxxer

К.О.
Партнер клуба
ага... задокументированный баг является фичей :D
 

slash

Новичок
это не совсем баг, господа, а особенности работы пхп: пока не изменяется объект, он не копируется. исключением являются ссылки.

1) создаётся массив $a ($a, ref_count=1,is_ref=0; $a[0], refcount=1, is_ref=0)
2) делается ссылка $b =&$a[0] ($a, refcount=1, is_ref=0; $a[0], refcount=2,is_ref=1).
3) делается ссылка $c=$a ($a, refcount=2,is_ref=0; $a[0], refcount=3, is_ref=1). это происходит по тому, что единожды получив флаг "имеется ссылка" все последующие присвоения будут работать как ссылки на переменную.
так как в примере не делается изменение самого массива $a, а делается изменение объекта "ссылка", то и копирования не происходит

короче, юзайте ссылки как можно меньше :)
 
  • Like
Реакции: atv

Armageddance

Новичок
$a = (array) 'A'; - это вообще что за конструкция такая? Первый раз встречаю.
 

zerkms

TDD infected
Команда форума
Armageddance
Приведение к массиву, очевидно.
Сложно выполнить и посмотреть?
 

HraKK

Мудак
Команда форума
Это не баг, старинная фича пхп, уже года полтора ею на собеседовании достаю)
 
Сверху