Оператор clone в php: как работает?
Это сделано для того, чтобы при клонировании объекта Person, одно из его свойств(которое является объектом) тоже было клонировано.
Пример:$person1 = new Person;
//Например $person1->address это объект со свойством id = 1
$person2 = clone $person1;
//Устанавливаем свойство id для объекта $person2->address
$person2->address->id = 2;
echo $person1->address->id; //выведет 1
echo $person2->address->id; //выведет 2
Теперь представим что public function __clone() {} внутри класса Person нет$person1 = new Person;
//Например $person1->address это объект со свойством id = 1
$person2 = clone $person1;
//Устанавливаем свойство id для объекта $person2->address
$person2->address->id = 2;
echo $person1->address->id; //выведет 2
echo $person2->address->id; //выведет 2
Т.к. объект Address не был клонирован, мы обращаемся к одному и тому же объекту Address
Если разобраться, то все просто. 

Метод __clone, как уже писали ранее, вызывается ПОСЛЕ клонирования объекта. До его вызова php создает "поверхностную" копию объекта. Это значит, что если в одном из свойств клонируемого объекта хранится другой объект, то php копирует в новый объект его ссылку. После этой операции $original->address и $clone->address указывают на один и тот же объект. (пример кода ниже). 

Если нам нужно клонировать какое-то свойство-объект, то мы можем сделать это в методе __clone. Мне привычнее воспринимать его как коллбэк. В этом методе $this - это клон (новый объект). 

Теперь вспомним то, что php при присваивании выполняет сначала ПРАВУЮ часть операции, а затем левую. 
В данном случае это значит: "Эй, интерпретатор, возьми и клонируй то, что лежит у меня в поле adress, потом возьми ссылку на этот объект, и запиши мне в поле address"

class Person {
  public function __clone() {
    $this->address = clone $this->address;
  }
}

$original = new Person();
$clone = clone $original;