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これは少し紛らわしいと思います。特に、次のコードを追加すると、

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

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

beforeがない場合にのみ機能します。誰かがこの背後にある理論的根拠を説明できますか?$myInteger

4

1 に答える 1

10

$this->$name同じことを意味するものではあり$this->nameません。1つ目は、ローカルスコープの変数$nameを使用して$this、名前が$name含まれているフィールドにアクセスし、2つ目はnameフィールドに直接アクセスします。

たとえば、次のように出力されますsomething

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

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

__getおよびの場合__set$name呼び出しサイトでアクセスされたプロパティの名前が含まれます。あなたの場合、myInteger

あなたの例では、__getandメソッドはパブリックであり、直接アクセスできる__setため、実際には不要です。クラスで明示的に宣言されていないプロパティへのアクセス試行をキャッチするためにのみ必要です。$myA->myInteger__get__set

たとえば、任意の「プロパティ」を動的に設定できるバッキング配列があるとします。

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;
    }
}

PHPの構文のこの側面についてやや混乱しているのは$、クラス内のフィールド宣言の前にあるが、そのフィールドにアクセスするときは何もないということです。これは、静的フィールドにアクセスするための構文によって複雑になりますが、これには!必要です。$

于 2011-02-07T12:34:58.983 に答える