9

そこで、最近、次のようなコード セグメントに出くわしました。

private static function FOO() {
        static $c = null;
        if ($c == null) {
            $c = new ParentClass_InnerClass();
        }
        return $c;
    }

では、このコードはどうなっているでしょうか。これはどのように違うのですか:

private static $C;

//other methods and fields    

private static function FOO() {
    if(!$self::c) {
        $self::c = new ParentClass_InnerClass();
    }
    return $self::c;
}

それとも同じ概念ですか?

4

3 に答える 3

8

範囲は異なりますが、基本的には同じ概念です。

class Foobar
{
    private static $c = null;
    public static function FOO()
    {
        if (self::$c === null)
        {
            self::$c = new stdClass;
        }
        return self::$c;
    }
    public static function checkC()
    {
        if (self::$c === null)
        {
            return false;
        }
        return self::$c;
    }
}

Foobar::checkC();//returns false, as $c is null
//function checkC has access to $c
$returned = Foobar::FOO();//returns object
if ($returned === Foobar::checkC())
{//will be true, both reference the same variable
    echo 'The same';
}

一方、コードを次のように変更するとします。

class Foobar
{
    public static function FOO()
    {
        static $c = null;
        if ($c === null)
        {
            $c = new stdClass;
        }
        return $c;
    }
    public static function checkC()
    {
        if ($c === null)
        {
            return false;
        }
        return $c;
    }
}

呼び出し時に通知が表示されcheckCます: 未定義変数。静的変数 $c は、FOOスコープ内からのみアクセスできます。プライベート プロパティは、クラス全体に適用されます。それは本当にそれです。
しかし、実際には、自分自身に好意を持ってください: 必要な場合にのみ statics を使用してください (インスタンス間でも共有されます)。PHP では、実際に static が必要になることはほとんどありません。

于 2013-10-24T15:23:54.037 に答える
7

これらは同じ概念ですが、最初のコード ブロックでは、静的変数は関数に対してローカルであり、そのような静的変数は、クラスのコンテキスト外であっても、任意の関数で使用できます。

function test() {
    static $counter = 0;
    return $counter++;
}

echo test(); // 0
echo test(); // 1
于 2013-10-24T15:16:17.553 に答える
1

上の例$cでは、ローカル スコープ ( FOO()) からのみアクセスできます。下の例では、$cform だけでなく、クラス全体からアクセスできますFOO()

于 2013-10-24T15:16:26.710 に答える