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