Ответ
Copy-on-Write (COW) — это внутренняя оптимизация в PHP, которая откладывает фактическое копирование данных (например, массива или строки) до момента, когда одна из переменных пытается изменить эти данные. Пока данные только читаются, несколько переменных могут ссылаться на одну и ту же область памяти, что экономит ресурсы.
Наглядный пример с массивом:
// Исходный массив занимает память X
$originalArray = [1, 2, 3, 4, 5];
// Присваивание. Копирования НЕТ.
// $copyArray и $originalArray ссылаются на одни и те же данные (zval).
$copyArray = $originalArray;
// Пока мы только читаем, память не дублируется.
echo $copyArray[0]; // Выводит: 1
// МОМЕНТ КОПИРОВАНИЯ (Write).
// Теперь, когда мы пытаемся изменить $copyArray,
// PHP создает физическую копию данных для $copyArray.
$copyArray[] = 6;
// Теперь $originalArray и $copyArray — это два независимых массива в памяти.
print_r($originalArray); // [1, 2, 3, 4, 5]
print_r($copyArray); // [1, 2, 3, 4, 5, 6]
Где это применяется и почему важно:
- Передача аргументов в функцию: При передаче массива в функцию по значению копия создается только если функция его модифицирует.
- Возврат из функции: Возвращаемый массив не копируется, пока вы не попытаетесь его изменить.
- Экономия памяти: В сценариях с большими массивами, которые часто присваиваются, но редко меняются, COW дает значительный выигрыш в производительности и потреблении памяти.
Важное отличие для объектов: Начиная с PHP 5, объекты по умолчанию передаются и присваиваются по ссылке на объект (object handle). Механизм COW к самим объектам не применяется, но может применяться к их внутренним свойствам-массивам.