У меня есть класс a и его экземпляр с использованием новых
$obja = new a;
Я знаю разницу между двумя строками
$obja2 = $ojba; $obja2 = clone $obja;
Но даже если вы объявляете или не объявляете __clone в классе a, первая строка $ obja2 относится к пространству памяти $ obja, а вторая строка создает копию $ obja. До сих пор это ясно для меня.
Тогда почему php имеет магический метод __clone? Это только для выполнения набора кодов, который написан внутри __clone, в то время как мы используем $ obja2 = clone $ obja;
Кто-нибудь, пожалуйста, помогите лучше понять это.
void __clone ( void )
После завершения клонирования, если метод
__clone()
определен, тогда будет вызываться метод__clone()
вновь созданного объекта, чтобы разрешить любые необходимые свойства, которые необходимо изменить.http://php.net/manual/en/language.oop5.cloning.php#object.clone
Так что да, это обратный вызов после завершения операции clone
. Ни больше ни меньше.
clone
ключевого слова в PHP представляет собой мелкую копию .
Чтобы получить глубокую копию , вам необходимо реализовать магический метод __clone
Если вы клонируете объект, у которого есть член, который является объектом другого класса с простым ключевым словом clone
, вы будете хранить ту же ссылку на этот второй объект.
Вот где глубокая копия пригодится, с чем-то вроде этого:
public function __clone() { $this->someOtherObject = clone $this->someOtherObject; }
При этом вы гарантируете, что клон будет глубоким , что означает, что он также клонирует объекты-члены, вместо того, чтобы просто сохранить исходную ссылку на них.