Предотвращает ли копирование при записи дублирование данных в массивах?

Я программирую клиент веб-API на PHP, который анализирует данные CSV в ассоциативные массивы, и я хочу защитить своих пользователей от дублирования данных при использовании этих массивов.

Мои пользователи никогда не будут писать в эти массивы (теоретически могли, но на практике это не имеет смысла).

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


person thwd    schedule 17.06.2012    source источник


Ответы (2)


Копировать при записи, как следует из названия, означает, что никакая переменная не копируется, пока что-то не будет записано; пока в передаваемой переменной не изменяется ни один байт, PHP заботится о том, чтобы избежать ненужных дубликатов автоматически и без необходимости использования явных ссылок благодаря этому механизму.

В этой статье объясняется подробно, как это реализовано в исходном коде PHP, и, как предлагается в статье, с помощью xdebug можно легко проверить, не дублируются ли переменные с помощью функции xdebug_debug_zval.

Кроме того, в этом ответе здесь, на SO, есть дополнительная информация о копировании при записи.

person Mahn    schedule 17.06.2012
comment
У меня есть дополнительный вопрос. Что произойдет, если вы скажете: $a=array(...); $b=$a; $b[4000].="x"; Будет ли продублирован весь массив или только один элемент с индексом 4000? - person soger; 10.04.2018
comment
Итак, чтобы ответить на мой собственный вопрос, весь массив не будет дублироваться только одним индексом, вы можете увидеть это с помощью кода: php -r '$a=str_repeat("a",1024*1024*1024);$b=str_repeat("b",1024*1024*1024);$a=array($a,$b);$b=$a;$b[1].="x";echo "done\n";sleep(1000000);' пока он спит, вы можете проверить с помощью своего любимого системного монитора, что он использует только 3 ГБ оперативной памяти (было бы 4, если был продублирован весь массив). - person soger; 12.04.2018

Если вы их не измените, массивы не будут скопированы.

person Evert    schedule 17.06.2012
comment
Спасибо за быстрый ответ. Если у вас будет время, я был бы очень благодарен, если бы вы подробнее остановились на этом вопросе. Будут ли принимающие массивы работать с указателями? Или вы могли бы дать ссылку на дополнительную информацию, подтверждающую ваш ответ? - person thwd; 18.06.2012