2013-02-18 11 views
6

私は同じ出力を期待している2つのコードスニペット(staticキーワードに関する)がありますが、実際には出力が異なります。php staticプロパティ

質問はなぜですか?

スニペット1

class base 
{ 
    public static $var = 1; 
} 

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

echo base::$var; // Outputs 1 

スニペット2

class base2 
{ 
    public static $var2 = 1; 
} 

class sub2 extends base2 
{ 
} 

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

ちょうど私はあなたが 'const'と結果が混乱している疑いがある – nut

+0

を更新し、先端に感謝し、:後でこのようなsubクラスから$varを変更する場合にも変化しません。 PHPでは 'static'はインスタンスとは独立したプロパティを定義します。しかし、それはまだ変わることがあります。 – datasage

+0

@ user1970939、あなたは実際に何を達成しようとしていますか?あなたは 'public static $ var = 2;'を削除したので出力が異なります。しかし、あなたはそれを知っています。では本当の質問は何ですか? – Matthew

答えて

11

もう一度ポイントを追加します。

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

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

-

あるVinod

+0

ので、私は、このサブのような最初のコードのクラスのサブのvarの値を変更する場合は、urの説明:: $ var = 3;クラスベースのvarの値を更新しますか? – zamil

+0

はい、そうです。やってみて。 –

+0

いいえ、そうではありません。クラスベース{ public static $ var = 1; } class subは基底を拡張{ public static $ var = 2; } sub :: $ var = 3; エコーベース:: $ var; echo sub :: $ var;これを試してください – zamil

7

Public static variableは、globalのように動作します。

public static variableのスコープがグローバルにあるとして、あなたはglobal variableへの変更がprogram.Thisの概念を越え見ることができるようにすることができ、あなたは

で見てください....あなたのサンプルプログラムで分析することができますStatic variable inheritance

+0

先端に感謝 – nut

+0

あなたは歓迎です....しかし、私は静的変数を使用することをお勧めしません... –

+1

@downvoter:ケアコメント? –

0

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

最初のコードでは、拡張されたクラスでオーバーライドしました。いずれの変数もそれぞれのクラスのスコープを持っています。

+0

それは間違っている、静的変数/メソッドのオーバーライディングの概念はありません。それはちょうど同じ共有メモリです。私のコメント –

+0

を参照してください私たちは間違いなく静的なメソッドをオーバーライドすることができます。しかし、静的なプロパティについては不明ですが、uは同じクラスの親クラスと同じ変数を宣言する場合、同じメモリ位置を指しません。 – zamil

+0

合意した、あなたの前の質問に私の答えを参照してください –

0

あなたはサブクラスに静的変数を渡す場合、この変数は共有されている(それは常に両方のクラスで同じ値を持っています)。サブクラス内の静的変数を上書きすると、その静的変数は親からの静的変数に依存しません。あなたはクラスsub$var = 2;を定義しているためスニペット1base::varsub::var

は、異なるメモリ割り当てを持っています。あなたはクラスsub2$var2を指定しなかったので、スニペット2base::varsub::var

は、同じメモリ割り当てを持っています。

なぜbase:varは変更されていません。

class base 
{ 
    public static $var = 1; 
} 

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