マニュアルに「静的変数(static variables)」って書かれてるやつ、ですね。
端的には、関数(含むメソッド)の中で
function hoge() { static $i = 0; }
とか、ってやつです。
で、これ、メソッドでも書けるのですが。
その時の「staticで保持している単位」が今一つ不明だったんで、ちぃと興味があって。
マニュアルに書いていない(と思う。記載があったら、箇所を教えていただけると幸い)内容なんで。
一端、PHP PHP 7.3.1(と、別環境で手持ちにあった7.2.13) で動かしてみた結果でございます。
コードは、こんなん。
class Hoge { public function h() { static $class = null; static $i = 0; $class = $class ?? get_called_class(); $i ++; echo "{$class}:{$i}\n"; } } class Foo extends Hoge { } class Bar extends Hoge { } $h_obj = new Hoge(); $h_obj2 = new Hoge(); $f_obj = new Foo(); $b_obj = new Bar(); $h_obj->h(); $h_obj2->h(); $f_obj->h(); $b_obj->h(); $h_obj3 = clone $h_obj2; $h_obj2->h(); $h_obj3->h();
結果は、こんなん。
何となくだけど、staticの変数の中身、class単位で持ってそうな感じだなぁ。
だから、Hogeについては「別インスタンス」だろうが「cloneでのcopy」だろうが、同じ値を地続きで持ってる。
な~~んとなく、privateなメソッドを「同じclassの、別インスタンスからcallできる」あたりとの関連性を想起するんだけど、実際、ど~なんだろ???
ちょいと興味があったのと、思ったより興味深い結果になったので、メモり。