Поможет ли копирование при записи предотвратить дублирование данных в массивах?
Я программирую клиента PHP API на PHP, который анализирует данные CSV в ассоциативные массивы, и я хочу защитить своих пользователей от дублирования данных при использовании этих массивов.
Мои пользователи никогда не будут писать в эти массивы (теоретически они могли бы, но на практике это не имеет смысла).
Теперь мой вопрос: если мои пользователи передадут эти массивы в качестве аргументов методам, будет ли механизм копирования и записи в PHP предотвращать дублирование данных или любой метод, который явно не принимает ссылку на массив, получит полную копию из массива?
2 ответа
Копировать при записи, как следует из названия, означает, что ни одна переменная не копируется до тех пор, пока что-то не будет записано; до тех пор, пока в передаваемой переменной не будет изменено ни одного байта, PHP позаботится о том, чтобы избежать ненужных дубликатов автоматически и без необходимости использования явных ссылок благодаря этому механизму.
В этой статье подробно объясняется, как это реализовано в исходном коде PHP, и, как показано в статье, с помощью xdebug можно легко проверить, что переменные не дублируются функцией xdebug_debug_zval.
Кроме того, этот ответ здесь, на SO, имеет больше на Copy-on-Write.