В php5 у нас появились новые принципы работы с объектами:
- копирование объекта;
- передача объекта по ссылке.Рассмотрим фрагмент кода:
[php] $obj2 = $obj1; //копирование объекта в PHP4 $obj2 = &$obj1; //передача по ссылке в PHP4 $obj2 = $obj1; //передача по ссылке в PHP5 $obj2 = clone $obj1; //копирование объекта в PHP5 [/php]
В PHP4 первая строка — это копирование объекта; вторая строка — передача объекта по ссылке, т.е. это один и тот же объект, только называется по-разному (грубо — как ярлык на рабочем столе).
А в PHP5 третья строка кода — это уже передача по ссылке. А копирование в PHP5 идет через clone (четвертая строка кода).
Поэтому важно знать, под какую версию php был написан код, если вы работаете с чужим кодом.
При клонировании в php5 конструктор не вызывается. Но ведь при клонировании создается новый объект. И у нас может возникнуть потребность что-то автоматически выполнить (как в случае с конструктором). Поэтому мы можем описать метод __clone. Т.е. когда php видит клонирование объекта, он лезет внутрь класса и ищет этот метод. Если такой метод есть, php его автоматом вызывает. Пример метода __clone.
[php] class MyClass { public $property; function __clone(){ $this->property = 2;} } $myObj = new MyClass(); $myObj->property = 1; $myObj2 = clone $myObj; print($myObj->property); // Печатает 1 print($myObj2->property); // Печатает 2 [/php]