マニュアルに「静的変数(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できる」あたりとの関連性を想起するんだけど、実際、ど~なんだろ???
ちょいと興味があったのと、思ったより興味深い結果になったので、メモり。