初めまして・お久しぶり、こんにちは。
システム開発事業部のARAこと荒島です。

今回は『PHPのコピーオンライトについて』について書きます。

この『コピーオンライト』と言うのは”変数の宣言・代入時にメモリを節約する仕組み”になります。
PHPの内部構造に軽く触れる内容ですが、「代入演算子が分かる」くらいの初心者の方でも何となく理解できると思います。maybe!!

4回に分けて書きます。お付き合い頂ければ幸いです。
Part1:変数同士の代入
Part2:オブジェクト同士の代入
Part3:COWの罠①
Part4:COWの罠②
Part5:まとめ

================
<変数同士の代入>
変数同士の代入時は、下記のようになっています。
①コピー先にコピー元のデータは複製(コピー)されていない
②コピー元・コピー先のいずれかの変数が変更される直前に、$aのデータが$bに複製される

文字だけではわからないですネ!
少し具体的に書くと、下記のようになります。

——–
【コード】
$a = 123;
$b = $a;
$a = 456;

【説明】
■1行目
①$aのメモリ領域を確保
②$aにデータ(123)を格納
■2行目
①$bのメモリ領域を確保
②$bが$aを参照するように設定
■3行目
①$bに$aのデータをコピー
②$aのデータを456に変更
——–

コピー元の変更が行われる直前(3行目)まで『変数$bは変数$aを参照している状態』になるのです!
同じデータが2つない分だけ、メモリが節約されることになりますね。

変数が配列の場合、”どの要素が変更されても配列がCOWされる”ようになっています。
※例外があります。詳しくはpart2以降で書きます

================

因みに、COWはオペレーティングシステム(OS)でも使用されています。

以上、『Part1:変数同士の代入』でした。
Part2へ続きます。