Использование __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;
}
При этом вы гарантируете, что клон будет глубоким, что означает, что он также клонирует объекты-члены, вместо того, чтобы просто сохранить исходную ссылку на них.