LINUX.ORG.RU

Ссылки на элементы массива в PHP


0

1

Это очень интересный прикол с массивами в PHP, если о нём не знать заранее, можно сломать голову на поиск ошибки, если с ним столкнуться.

$arr = array(
    'a' => 1,
    'b' => 1,
);
$ref= &$arr['b']; // $ref ссылается на те же данные, что и $arr['b']
$copy = $arr; // $copy должен содержать независимую копию массива $arr
$copy['b'] = 'X'; // $arr не должен быть изменён
print_r($arr); // $arr( 'a' => 1, 'b' = 'X' ) $arr изменён, ёлки-палки

unset($ref); // Удаляем постороннюю ссылку
$copy = $arr;
$copy['b'] = 'Y'; // Измениться ли $arr?
print_r($arr); // $arr( 'a' => 1, 'b' = 'X' ) - Нет

Как я понял, если существует хотя бы одна переменная, которая ссылается на те же данные, что и некоторый элемент массива, то этот элемент массива всегда будет копироваться «по ссылке», когда копируется сам массив. Если же удалить эту постороннюю переменну-ссылку (в примере выше это $ref), то элемент массива начинает копироваться как должен.



Последнее исправление: Graduate (всего исправлений: 1)

А теперь будь бобр, сообщи нам, за каким лядом в скриптовом языке с динамической типизацией использовать ссылки и указатели?

Страшно подумать сколько открытий ты сделаешь, если вдруг у тебя руки до перла дойдут.

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

Баг остаётся багом. Такая конструкция вполне может быть использована где угодно за исключением «hello world» для которого php и предназначен.

tyler19
()
Ответ на: комментарий от tyler19

Такая конструкция вполне может быть использована

И для чего же? Ну расскажи мне где это в скриптовом языке, да с соблюдением нормального стиля, без ссылок и указателей вот прям чтоб не жизнь, а я поржу.

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

Вы так говорите, как будто нет серьёзных проекторв на РНР

Gordon01 ★★
()

Хочешь независимую копию - используй clone. Просто предположение, проверять лень.

SOmni ★★
()

Этот бот занимается перепостингом фрагментов документации PHP, а наивные жители страны ЛОР ведутся как дети на леденец :)

http://www.php.net/manual/ru/language.references.whatdo.php

там

Иными словами, поведение отдельных элементов массива не зависит от типа присвоения этого массива.

А потом приходит tyler19 и открывает всем глаза на предназначение PHP и смысл жизни.

P.S.: Вот что с людьми высшее образование делает :)

Munhgauzen
()

Вы некорректно формируете указатель $ref на $arr['b']
Нужно в массив поместить ссылку на значение по индексу 'b', тогда все получится...

$val = 1;
$refVal = & $val;
$arr = array(
    'a' => 1,
    'b' => $refVal
);

Почему нельзя сразу в массиве ссылаться на указатель?

Полагаю, парсер php в первую очередь заточен на скорость и разбор выражения вида:

& $arr['b']
не выполняется полностью. Со ссылками массивов неудобно работать. Предпочтительнее использовать, где уместно объекты. Они всегда являются ссылками.

swwwfactory ★★
()
Ответ на: комментарий от Munhgauzen
— Вот у вас, Джонсон, есть высшее образование?
— Бог милостив, сэр!
Xenesz ★★★★
()
Ответ на: комментарий от r_asian

И для чего же? Ну расскажи мне где это в скриптовом языке, да с соблюдением нормального стиля, без ссылок и указателей вот прям чтоб не жизнь, а я поржу.

$new_user =& $_POST['new_user'];
foreach ($new_user as &$val) $val->trim!();
tyler19
()
Ответ на: комментарий от tyler19

OMFG. WTF?

1. Использовать глобальные переменные без надобности — моветон
2. Использовать модификацию _POST — моветон
3. Что за невалидный код?

KRoN73 ★★★★★
()
Ответ на: комментарий от tyler19

А как же, стесняюсь спросить, не используя глобальные переменные получить ввод юзера?

Из синглтона, обслуживающего запрос, естественно. Вопрос не в том, чтобы не использовать глобальные переменные. А в том, чтобы использовать их только в одном месте, не размазывая прибивку гвоздями костылей по всему коду.

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.