web-dev-qa-db-ja.com

php静的プロパティ

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

14
nut

もう一点付け加えたいと思います。

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

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

-

ヴィノド

18

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

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

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

8
Akash KC

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

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

0
zamil

静的変数をサブクラスに渡すと、この変数は共有されます(両方のクラスで常に同じ値になります)。サブクラスの静的変数を上書きすると、親の静的変数から独立した新しい静的変数になります。

Snippet 1base::varsub::varでは、クラスsub$var = 2;を定義したため、メモリ割り当てが異なります。

Snippet 2base::varsub::varは、クラス$var2sub2を指定しなかったため、同じメモリ割り当てがあります。

そのため、base:varは変更されていません。また、後で$varsubクラスから次のように変更しても、変更されません。

class base
{
    public static $var = 1;
}

class sub extends base
{
    public static $var = 2;
}
sub::var = 3
echo base::var; // Outputs 1
0
Adam