Еще в ноябре 2005 года на встрече в Париже разработчики обсудили новые возможности следующей, шестой, версии PHP. Интересует ли Вас, какой будет эта версия? Примите участие в опросе, который проводится на сайте рассылки.
[опрос на английском языке: PHP 6: Are you interesting in? (PHP 6: Вы зантересованы?) - YES (ДА) - NO (НЕТ)]
Клонирование
The Pterodactyl
Copyright 2006 Pterodactyl's School
Copyright 2006 Pterodactyl's School.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
10.03.2006
История переиздания
Издание 1.00
[ Дата ]
Первоначальная версия.
Аннотация
Рассмотрены особенности копирования объектов в PHP 4 и PHP5. Освещено применение ключевого слова clone и метода __clone.
Одной из важнейших особенностей объектной модели PHP 5 является то, что ключевое слово new, создавая новый объект, возвращает его идентификатор (в PHP 4 возвращался сам объект).
В PHP 4 переменная $obj1 будет содержать новый объект. Присвоение $obj2 = $obj1; вызовет копирование этого объекта, т. е. переменная $obj2 будет содержать новую копию первого объекта. Соответственно, изменение значения переменной $obj2->test не повлияет на переменную $obj1->test, так как они принадлежат разным объектам.
А вот в PHP 5 переменная $obj1 будет содержать идентификатор объекта; он же будет присвоен и переменной $obj2 в результате присвоения $obj2 = $obj1;. Таким образом, обе переменные будут содержать идентификатор одного и того же объекта, а $obj1->test; и $obj2->test будут представлять одну и ту же переменную.
PHP Version: 5.1.2
Object 1: Object id #1 (test = 2)
Object 2: Object id #1 (test = 2)
Становится ясно, что PHP 5 нуждается в каком-то ином механизме копирования объектов.
Ключевое слово clone
В PHP 5 для копирования объектов используется ключевое слово clone (поэтому говорят также о клонировании).
$copy = clone $object;
Клонирование объекта приводит к созданию его точной копии (т. е. все переменные имеют те же значения, что и у оригинального объекта в момент клонирования). Тем самым клонирование заменяет копирования объектов в PHP 4 путем присвоения (см. «Копирование объектов в PHP 4 и PHP 5»). На самом деле, клонирование предоставляет
даже более широкие возможности, нежели обычное копирование.
Рассмотрим следующую ситуацию. Например, разрабатывается банковское приложение и, в частности, класс BankAccount, содержащий анкетные сведения о владельце счета и о текущей сумме вклада.
class BankAccount {
public $name;
public $birthday;
public $address;
public $amount;
function __construct($name, $birthday = '', $address = '')
{
$this->name = $name;
$this->birthday = $birthday;
$this->address = $address;
$this->amount = 0;
}
}
При открытии счета новому клиенту пользуемся традиционным способом - ключевым словом new.
$account = new BankAccount('Bill Gates');
Однако, при открытии дополнительного счета уже существующему клиенту целесообразнее воспользоваться методом клонирования, чтобы избежать повторного заполнения анкетных данных (это не только требует определенных временных затрат, но и несет в себе опасность искажения данных в результате ошибки).
$account2 = clone $account;
Казалось бы, все хорошо, но... что, если на основном счету уже содержится определенная сумма? Тогда эта сумма будет автоматически продублирована и на дополнительном счету. Чтобы избежать этого, понадобится дополнительная строка кода.
$account2->amount = 0;
А теперь представьте себе, что...
класс BankAccount создается одним, а его объекты клонируются другим разработчиком;
такое клонирование применяется в приложении многократно;
бонусы клиентам к столетнему юбилею банка не предусмотрены;
да, собственно, и юбилея никакого не предвидится;
...и ответьте на вопрос: "На чьем месте Вы бы предпочли оказаться - разработчиков данного приложения или клиента банка, открывающего дополнительный счет?".
Впрочем, в действительности все оказывается не таким страшным.
Метод __clone
Еще одно нововведение PHP 5, метод __clone, если определен, при клонировании объекта автоматически вызывается для вновь созданной копии (и ни в какой ситуации не может быть вызван напрямую).
Это значит, что у разработчиков появляется возможность управлять процессом копирования. Так, например, в только что рассмотренном нами примере с банковским приложением, проблема с дублированием суммы при открытии дополнительного счета легко решается путем определения метода __clone.
class BankAccount {
// ...
function __clone()
{
$this->amount = 0;
}
}
Теперь можно безбоязненно пользоваться клонированием, не заботясь более об обнулении счетов. Они будут обнуляться автоматически.