14

同じ出力が期待される2 つのコード スニペット (staticキーワードに関して) がありますが、実際には出力が異なります。

問題はなぜですか?

スニペット 1

class base
{
    public static $var = 1;
}

class sub extends base
{
    public static $var = 2;
}

echo base::$var; // Outputs 1

1

スニペット 2

class base2
{
    public static $var2 = 1;
}

class sub2 extends base2
{
}

sub2::$var2 = 2;
echo base2::$var2; // Outputs 2

2

4

4 に答える 4

21

そこにもう一点付け加えておきたい。

STATIC 変数は、クラスの特定のインスタンス/オブジェクトに関連付けられていません。したがって、親クラス参照または子クラス参照で変数を変更すると、同じコピーが変更されます。

したがって、Public Static をグローバルとして理解することとは別に、特定のインスタンスに関連付けられていないことを理解してください。したがって、クラス階層参照を使用して静的変数を更新すると、同じメモリ位置が更新されます。

--

ヴィノード

于 2013-02-18T05:43:04.027 に答える
8

Public static variableglobal変数のように機能します。

のスコープpublic static variableはグローバルに存在するため、 への変更をglobal variableプログラム全体で確認できます。この概念により、サンプル プログラムで分析できます。

静的変数の継承をご覧ください。

于 2013-02-18T05:32:12.543 に答える
0

sub2 クラスには var2 がないため、base2 クラスの値を取ります。したがって、これを使用して新しい値を割り当てると、新しい値sub2::$var2 = 2;に変更されました。

最初のコードでは、拡張クラスでそれをオーバーライドしました。両方の変数には、それぞれのクラス内にスコープがあります。

于 2013-02-18T05:40:59.923 に答える