Присвоение одного объекта другому в PHP
Опубликовано: 06.09.2018
Большинство объектов представляют собой довольно сложные конструкции, которые могут содержать массивы или другие объекты. Это вызывает необходимость оперировать не самими объектами, а ссылками на области памяти, в которой они хранятся. В соответствии с этим присвоение одного объекта другому приводит к получению не двух независимых объектов, а двух имён переменных, каждая из которых содержит ссылку на один и тот же объект и ту же область памяти. Объектно-ориентированная модель PHP не предусматривает перегрузку операторов, и разработчик не может переопределять их поведение для объектов.
На примере класса "myEffect" содержащий один единственный открытый член, мы продемонстрируем этот эффект.
class myEffect { public $_element; } $_start = new myEffect(); $_next = new myEffect(); $_start->_element = 'TRUE_start'; $_next = $_start; # Присвоение одного объекта другому не приводит к созданию его копии; $_next->_element = 'TRUE_next'; echo $_start->_element; # Результат: TRUE_next ;В результате работы скрипта будет выведено значение "TRUE_next". После того как объект "$_start" присвоен второму объекту "$_next", изменение одного из объектов приводит к изменению обоих объектов одновременно. Присвоение объекта в качестве значения может выполняться не только явным образом при помощи оператора "=", но и неявно, например, передачей объекта функции в качестве аргумента. Все объекты и массивы (с версии 5), автоматически передаются в функцию по ссылке. Это означает, что все изменения, которые функция производит с объектом сохраниться и после её завершения.
3 Урок - функции.
Приведём пример передачи объекта класса "myEffect" функции, где происходит изменение состояния объекта. Передача объекта функции в качестве аргумента:
class myEffect { public $_element; } $_Class_myEffect = new myEffect(); $_Class_myEffect->_element = 9999; $_element = 9999; function effect ($_element, $_Class_myEffect) { $_Class_myEffect->_element = '<div>Новое значение</div>'; $_element = 10000; } effect($_element, $_Class_myEffect); echo $_Class_myEffect->_element; # Результат: Новое значение; echo $_element; # Результат: 9999;Как видно из примера, функция "effect()" не может изменить значение обычной переменной "$_element", которая передаётся ей в качестве аргумента, тем не менее, объект "$_Class_myEffect" претерпевает изменения. Следует отметить, что хотя массивы, так же как и объекты, передаются по ссылке, они ведут себя подобно обычным переменным, то есть не подвергаются изменению во внешнем коде, если элементы подвергались изменению внутри функции.
Словари