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
もう一点付け加えたいと思います。
STATIC変数はnotクラスの特定のインスタンス/オブジェクトに関連付けられています。したがって、親クラス参照または子クラス参照を使用して変数を変更すると、同じコピーが変更されます。
したがって、Public Staticをグローバルとして理解することとは別に、特定のインスタンスに関連付けられていないことを理解してください。したがって、クラス階層参照を使用して静的変数を更新すると、同じメモリの場所が更新されます。
-
ヴィノド
Public static variable
はglobal
変数のように機能します。
public static variable
のスコープはグローバルにあるため、global variable
への変更をプログラム全体で確実に確認できます。この概念は、サンプルプログラムで分析できます。
静的変数の継承 をご覧ください。
Sub2クラスにはvar2がないため、base2クラスの値を取ります。したがって、このsub2::$var2 = 2;
を使用して新しい値を割り当てると、新しい値に変更されます。
最初のコードでは、拡張クラスでそれをオーバーライドしています。両方の変数に、それぞれのクラス内にスコープがあります。
静的変数をサブクラスに渡すと、この変数は共有されます(両方のクラスで常に同じ値になります)。サブクラスの静的変数を上書きすると、親の静的変数から独立した新しい静的変数になります。
Snippet 1base::var
とsub::var
では、クラスsub
で$var = 2;
を定義したため、メモリ割り当てが異なります。
Snippet 2base::var
とsub::var
は、クラス$var2
でsub2
を指定しなかったため、同じメモリ割り当てがあります。
そのため、base:var
は変更されていません。また、後で$var
をsub
クラスから次のように変更しても、変更されません。
class base
{
public static $var = 1;
}
class sub extends base
{
public static $var = 2;
}
sub::var = 3
echo base::var; // Outputs 1