(PHP5) Почему присваивание работает как клонирование? Код с этой страницы php.net/manual/ru/language.oop5.basic.php из примера #4var = '$assigned будет иметь это значение'; $instance = null; // $instance и $reference становятся null var_dump($instance); var_dump($reference); var_dump($assigned); ?>
РезультатNULL NULL object(SimpleClass)#1 (1) { ["var"]=>
string(30) "$assigned будет иметь это значение" } А есть ещё клонирование php.net/manual/ru/language.oop5.cloning.php Я правильно понял, что клонирование без определённого в классе метода __clone() делает тоже самое, что и обычное присваивание? Я вообще ожидал в этом примере, что $assigned будет NULL, а на деле как-будто написали $assigned = clone $instance; Так в чём же разница?
Да, присваивание в PHP работает как клонирование только для объектов. Когда объект присваивается переменной, переменная фактически получает ссылку на объект, а не сам объект. Это означает, что изменения, внесенные в одну переменную, отразятся на другой переменной, так как они обе ссылается на один и тот же объект.
Клонирование, с другой стороны, создает копию объекта, т.е. новый объект, который содержит те же значения свойств, что и исходный объект, но является отдельным объектом. При клонировании изменения в одном объекте не повлияют на другой.
Если класс не имеет метода __clone(), то при клонировании объекта будет создана поверхностная копия объекта, т.е. значения всех свойств будут скопированы, но не их ссылки. Таким образом, новый объект и оригинал будут иметь разные свойства, но свойства-объекты будут ссылаться на одни и те же объекты.
В вашем примере, если бы вы использовали клонирование ($assigned = clone $instance), то $assigned содержал бы независимую копию объекта и не зависел бы от изменений в оригинальном объекте.
Таким образом, основное различие между присваиванием и клонированием заключается в том, что присваивание создает ссылку на объект, в то время как клонирование создает независимую копию объекта.
Да, присваивание в PHP работает как клонирование только для объектов. Когда объект присваивается переменной, переменная фактически получает ссылку на объект, а не сам объект. Это означает, что изменения, внесенные в одну переменную, отразятся на другой переменной, так как они обе ссылается на один и тот же объект.
Клонирование, с другой стороны, создает копию объекта, т.е. новый объект, который содержит те же значения свойств, что и исходный объект, но является отдельным объектом. При клонировании изменения в одном объекте не повлияют на другой.
Если класс не имеет метода __clone(), то при клонировании объекта будет создана поверхностная копия объекта, т.е. значения всех свойств будут скопированы, но не их ссылки. Таким образом, новый объект и оригинал будут иметь разные свойства, но свойства-объекты будут ссылаться на одни и те же объекты.
В вашем примере, если бы вы использовали клонирование ($assigned = clone $instance), то $assigned содержал бы независимую копию объекта и не зависел бы от изменений в оригинальном объекте.
Таким образом, основное различие между присваиванием и клонированием заключается в том, что присваивание создает ссылку на объект, в то время как клонирование создает независимую копию объекта.