2011-02-07 5 views
2

この質問が以前に尋ねられた場合は、私には失礼ですが、満足のいく結果は得られませんでした。

私はPHP(C++バックグラウンドから来ている)を学んでおり、次のあいまいさに遭遇しました。全く同じコード作業の次の2ビット:

class A 
{ 
    public $myInteger; 
    public function __get($name) 
    { 
     return $this->$name; 
    } 
    public function __set($name, $value) 
    { 
     $this->$name = $value; 
    } 
} 

class A 
{ 
    public $myInteger; 
    public function __get($name) 
    { 
     return $this->name; 
    } 
    public function __set($name, $value) 
    { 
     $this->name = $value; 
    } 
} 

クラスメソッド$this->$name$this->nameでまったく同じ機能を有しています。私はそれがのみ作品myInteger前には$がない場合、次のコードを追加した場合ことを考慮する場合は特に、

$myA = new A(); 
$myA->myInteger = 5; 
$hereInt = $myA->myInteger; 

echo "<p>" . $hereInt . "</p>"; 

を少し混乱これを見つけることです。誰かがこの背後にある根拠を説明してもらえますか?

+0

両方のクラスをクラスAにすることを意味しましたか? – Shrinath

+3

はい;もちろん、コードの2つのチャンクのうちの1つだけがいつでも使用されます。 –

+1

これは明確に定義されており、その背後にあいまいさはありません。 – BoltClock

答えて

9

$this->$nameおよび$this->namedo は同じことを意味する。最初はローカルスコープの変数$nameを使用して$thisのフィールドにアクセスし、$nameの名前になり、2番目のフィールドはnameフィールドに直接アクセスします。

は、例えば、次の意志出力something

$foo = new stdClass; 
$foo->bar = 'something'; 

$baz = 'bar'; 
echo $foo->$baz; 

__get__setの場合には、$nameを呼び出しサイトでアクセスされたプロパティの名前が含まれています。あなたの場合、myInteger

__get__setの方法は実際には余分です。$myA->myIntegerは公開されており、直接アクセスできます。 __getおよび__setは、クラス内で明示的に宣言されていないプロパティへのアクセス試行をキャッチするためにのみ必要です。

たとえば、あなたが動的に設定されるように、任意の「プロパティ」を可能にする補助配列を持っているかもしれません:

PHPの構文のこの側面について、やや紛らわしいです
class Foo 
{ 
    private $_values = array(); 

    public function __get($key) 
    { 
     if (isset($this->_values[$key])) 
     { 
      return $this->_values[$key] 
     } 
    } 

    public function __set($key, $value) 
    { 
     $this->_values[$key] = $value; 
    } 
} 

一つは$がフィールド宣言に先行することですあるクラスでは、そのフィールドにアクセスするときには何もありません。これは、静的フィールドにアクセスするための構文によってコンパイルされます。には$が必要です。

+0

つまり、もし '$ name == 'name''(変数 '$ name'に文字列' name'が含まれている)のみであれば、それらは同じ意味を持ちます。 – Mchl

+0

しかし、 'myInteger'をプライベート。私はあなたが意味することを得ると思いますが、なぜ '$ this-> name'で動作しますか?私。値を取得すると、どのフィールドにアクセスしますか? –

+1

@Kristian: 'myInteger'ではなく' name'フィールドにアクセスします。明らかに、これは、そのオブジェクトのフィールドに割り当てようとするコードは、そのフィールドの名前に関係なく、実際に同じフィールドにアクセスすることを意味します。 –

関連する問題