32820


**関数内で定義したstatic変数を、外部から操作するには？**  
・途中で初期化したい

[code]

    function hoge() {
        static $i = 0;
        $i++;
        echo $i;
    }
    
    hoge(); // 1
    hoge(); // 2
    hoge(); // 3
    //ここで、$iを当初の0へ戻したい
    hoge(); // 1とするには？
    
[/code]


CC BY-SA 3.0
2017-02-20T15:14:42.157
32819
2017-02-20T15:57:05.730
2017-02-20T15:31:53.690
8000
7886
question
php
関数内で定義したstatic変数を、外部から初期化するには？


ローカル変数と同様、関数外から直接アクセスすることはできません。

静的変数への参照を外部に漏らせばその値を変更することはできるようですが、（ローカル変数であるにも関わらず）`$i`
がどこでどう変更されるのか見当もつかなくなってしまい、わかりにくいバグを作りこんでしまう可能性が高まるかと思います。

[code]

    function &hoge() {
        static $i = 0;
        $i++;
        echo $i;
        return $i;
    }
    
    hoge(); // 1
    hoge(); // 2
    $i = &hoge(); // 3
    $i = 0; // ←万一これが $i = "hoge" だったりすると、おかしなことになる
    hoge(); // 1
    
[/code]

カウンタをリセットする手段を提供したいなら、メソッドにしてカウンタをフィールドに持たせるとか、関数でやりたいなら引数でリセットを指定できるようにしてはいかがでしょうか。

[code]

    function hoge($reset = false) {
        static $i = 0;
        if ($reset) $i = 0;
        $i++;
        echo $i;
    }
    
    hoge(); // 1
    hoge(); // 2
    hoge(); // 3
    hoge(true); // 1
    
[/code]


CC BY-SA 3.0
2017-02-20T15:47:54.343
32820
2017-02-20T15:57:05.730
2017-02-20T15:57:05.730
8000
8000
32819
answer