Если разобраться, то все просто.
Метод __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;