Использование __clone в PHP?

У меня есть класс a и его экземпляр с использованием новых

$obja = new a;

Я знаю разницу между двумя строками

$obja2 = $ojba;
$obja2 = clone $obja;

Но даже если вы объявляете или не объявляете __clone в классе a, первая строка $ obja2 относится к пространству памяти $ obja, а вторая строка создает копию $ obja. До сих пор это ясно для меня.

Тогда почему php имеет магический метод __clone? Это только для выполнения набора кодов, который написан внутри __clone, в то время как мы используем $ obja2 = clone $ obja;

Кто-нибудь, пожалуйста, помогите лучше понять это.

Ответ 1

void __clone ( void )

Как только клонирование будет завершено, если будет определен метод __clone(), тогда будет вызван метод созданного объекта __clone(), чтобы разрешить любые необходимые свойства, которые необходимо изменить.

http://php.net/manual/en/language.oop5.cloning.php#object.clone

Так что да, это обратный вызов после завершения операции clone. Ни больше ни меньше.

Ответ 2

clone ключевого слова в PHP представляет собой мелкую копию.

Чтобы получить глубокую копию, вам необходимо реализовать магический метод __clone

Если вы клонируете объект, у которого есть член, который является объектом другого класса с простым ключевым словом clone, вы будете хранить ту же ссылку на этот второй объект.

То, где глубокая копия пригодится, с чем-то вроде этого:

public function __clone()
{
    $this->someOtherObject = clone $this->someOtherObject;
}

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