Неоднозначный синтаксис переменной $ this -> $ в PHP - PullRequest
2 голосов
/ 07 февраля 2011

Пожалуйста, извините, если этот вопрос задавался ранее, но я попытался найти его без каких-либо удовлетворительных результатов.

Я изучаю PHP (из опыта C ++) и столкнулся со следующей неоднозначностью.Следующие два бита кода работают точно так же:

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

это только работает, если $ до myInteger нетМожет ли кто-нибудь объяснить объяснение этого?

1 Ответ

9 голосов
/ 07 февраля 2011

$this->$name и $this->name do not означают одно и то же.Первый использует локальную переменную $name для доступа к полю $this, имя которого содержит то, что содержится в $name, а второе напрямую обращается к полю name.

Например, следующеевыведет something:

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

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

В случае __get и __set, $name содержит имя свойства, к которому был получен доступ на сайте вызова;в вашем случае myInteger.

В вашем примере методы __get и __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, состоит в том, что $ предшествует объявлению поля в классе, но при обращении к этому полю его нет.Это усугубляется синтаксисом для доступа к статическим полям, который требует требует $!

...