gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

静的変数について調べてみた

マニュアルに「静的変数(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();

結果は、こんなん。

Hoge:1
Hoge:2
Foo:1
Bar:1
Hoge:3
Hoge:4

何となくだけど、staticの変数の中身、class単位で持ってそうな感じだなぁ。
だから、Hogeについては「別インスタンス」だろうが「cloneでのcopy」だろうが、同じ値を地続きで持ってる。
な~~んとなく、privateなメソッドを「同じclassの、別インスタンスからcallできる」あたりとの関連性を想起するんだけど、実際、ど~なんだろ???

ちょいと興味があったのと、思ったより興味深い結果になったので、メモり。