یکی از رفتارهای جالب PHP، مکانیزم Copy-on-Write هست.
مثلاً:
$data = range(1, 1_000_000);
$copy = $data;
شاید فکر کنی PHP همین لحظه یک آرایهی یک میلیونعضوی دیگه داخل Memory ساخته.
اما نه! 👀
حالا PHP تا وقتی داده تغییر نکرده، میتونه بین این دو متغیر از همان دادهی موجود استفاده کنه.
$data = range(1, 1_000_000);
$copy = $data;
// هنوز الزاماً یک کپی کامل ساخته نشده
اما داستان وقتی جالب میشه که یکی از آنها را تغییر بدی:
$copy[0] = 999;
اینجاست که PHP باید وضعیت داده را طوری مدیریت کند که تغییر $copy روی $data تأثیر نگذارد.
یعنی عملاً:
$data ─────┐
├──> Shared Memory
$copy ─────┘
↓ تغییر
$data ─────────> Original Data
$copy ─────────> New Copy
حالا یک نکتهی مهمتر 👇
همین موضوع یکی از دلایلیه که این کد:
function process(array $data)
{
// ...
}
لزوماً به این معنی نیست که با ورود $data به تابع، یک کپی کامل از آرایه ساخته میشود.
زبانPHP میتواند تا زمانی که داده تغییر نکرده، از Copy-on-Write استفاده کند.
اما اگر داخل تابع شروع به تغییر آرایه کنی:
function process(array $data)
{
$data['status'] = 'done';
}
شرایط Memory میتواند کاملاً متفاوت شود.
🔴 پس یک تصور اشتباه:
«قابلیت Pass by Value یعنی PHP همیشه همان لحظه کل داده را کپی میکند.»
نه لزوماً.
در PHP، برای دادههایی مثل Array، مکانیزم Copy-on-Write باعث میشود کپی فیزیکی داده تا زمان نیاز به تغییر، به تعویق بیفتد.
نکتهی Performance 🚀
اگر با آرایههای بزرگ، پردازش فایل، دادههای API یا پردازشهای سنگین کار میکنی، درک Copy-on-Write مهمه؛ چون ممکنه یک تغییر کوچک روی یک آرایهی بزرگ، باعث افزایش قابلتوجه مصرف Memory بشه.
حرفهای نوشتن PHP فقط کد نیست؛ باید بدونی Engine پشت این کد چه رفتاری داره. 🐘
@CodeVerse_dev