2017-09-09 4 views
1

私はクラスの各インスタンスで変数を使用しようとしています。1人のユーザーリクエスト中にPHPの静的変数

私の例のクラス:

class test { 
    private static $gvalue; 

    function setValue($value) 
    { 
     $this->gvalue = $value; 
    } 

    function getValue() 
    { 
     return $this->gvalue; 
    } 

} 

は今、私はこのクラスの「テスト」のインスタンスに作成し、いくつかの値をプリントアウトします。

$obj = new test(); 
$obj2 = new test(); 
echo "1: "; 
echo $obj->getValue(); 
echo "/"; 
echo $obj2->getValue(); 
$obj->setValue("green"); 
echo "<BR>2: "; 
echo $obj->getValue(); 
echo "/"; 
echo $obj2->getValue(); 

私の期待は次のような出力を得ることだった。

1:/ 2:グリーン/グリーン

しかし、結果は次のとおりです。

1:/ 2:グリーン/

私は間違ったことを理解しましたか?それとも、PHPでは不可能ですか? 最後のゴール。インスタンス(__construc)の作成中にいくつかの変数/配列を設定し、コード中のすべてのインスタンス(ユーザーの要求ごと)に設定したいと思います。

+1

静的変数を使用する場合は、あなただけのダブルコロンを使用することができます。 :それらと一緒に作業する –

+0

http://php.net/manual/en/language.oop5.paamayim-nekudotayim.php –

+0

静的変数は、特定のオブジェクトではなくクラス全体に関連付けられます。そのため、あなたは '$ self'を使ってそれらにアクセスしません。 – Barmar

答えて

4

あなたは、あなたのメソッドの実装では、静的プロパティにアクセスする方法を変更する必要があります。

<?php 

class Test { 
    private static $gvalue; 

    function setValue($value) { 
    self::$gvalue = $value; 
    } 

    function getValue() { 
    return self::$gvalue; 
    } 
} 

$obj1 = new Test(); 
$obj2 = new Test(); 
echo sprintf("1: %s/%s\n", $obj1->getValue(), $obj2->getValue()); 

$obj1->setValue("green"); 
echo sprintf("2: %s/%s\n", $obj1->getValue(), $obj2->getValue()); 

というの出力は次のとおりです。

1:/
2: green/green 
0

はあなただけ$objため$gvalueを設定します。あなたは$obj2のためにそれを設定していなかったので

$obj->setValue("green"); 

あなたが$gvalueの値をecho $obj2->getValue();、まだ何もありません。

$objおよび$obj2は、両方とも同じクラスの異なるインスタンスです。彼らは同じ特性などを持っていますが、異なる値を保持することができます。したがって、あなたが持っている出力:

1:/2: green/ 

が正しい出力です。

+0

OPは 'static'キーワードを使って値を共有しようとします... – arkascha

+0

@arkaschaああ、そうです。私は余分な情報のためにここにこの答えを残すでしょう、あなたの答えは正しい答えです。 –