Представим ситуацию: есть некоторый класс без свойств. Мы создали какой-то объект этого класса. И через объект обращаемся к свойству класса (такое свойство в классе не описано). Что будет? Никакой ошибки не будет. PHP сам создаст это свойство. См. пример:
class A{ //создаем класс пустой } $o = new A(); //создаем объект $o->name="Max"; //обращаемся к свойству, которого нет
Хотя ошибки здесь не будет, так делать НЕ НАДО. Самого свойства не будет в описании класса, оно будет где-то там в коде.
Но что делать, если мы хотим назначать динамические свойства? В строке №4 кода идет присваивание к неизвестному свойству. Php прежде, чем создавать это свойство, идет в класс и пытается найти метод __set, куда передает имя и соответствующее значение. Если мы опишем __set, то php его вызовет. См. код ниже:
class A{ public $user; function __set($n, $v){ $this->user[$n]=$v} //сюда придут имя и значение свойства function __get($n){ return $this->user[$n];} } $o = new A(); $o->name="Max"; echo $o->name;
В строке №10 (см. код выше) идет обращение к неизвестному свойству. В этом случае php ищет метод __get. И если он есть, php его вызывает (строки №5,6).
Т.е. метод __set применяется — когда php пытается поставить значение. А __get — когда php пытается взять значение.