Отправляет email-рассылки с помощью сервиса Sendsay

PHP 5: Новые возможности.

  Все выпуски  

Клонирование


PHP 5: Новые возможности.

Вниманию читателей!

Отдельные выпуски рассылки в той или иной мере взаимосвязаны; особенно, это относится к материалам практических занятий.

С предыдущими выпусками Вы можете ознакомиться:

  1. в архиве рассылки (оригиналы выпусков);
  2. на сайте рассылки (исправленные и дополненные версии).

# # #

Вы также можете подписаться на рассылку "PHP 5 для начинающих".

PHP 6 уже в разработке!

Еще в ноябре 2005 года на встрече в Париже разработчики обсудили новые возможности следующей, шестой, версии PHP. Интересует ли Вас, какой будет эта версия? Примите участие в опросе, который проводится на сайте рассылки.

http://pterodactyl.l2p.net/e107/

[опрос на английском языке: PHP 6: Are you interesting in? (PHP 6: Вы зантересованы?) - YES (ДА) - NO (НЕТ)]

The Pterodactyl

Copyright 2006 Pterodactyl's School

10.03.2006

История переиздания
Издание 1.00 [ Дата ]
Первоначальная версия.

Аннотация

Рассмотрены особенности копирования объектов в PHP 4 и PHP5. Освещено применение ключевого слова clone и метода __clone.


Одной из важнейших особенностей объектной модели PHP 5 является то, что ключевое слово new, создавая новый объект, возвращает его идентификатор (в PHP 4 возвращался сам объект).

print new stdClass;
Object id #1

Такая особенность имеет далеко идущие последствия. В частности, следующий код в PHP 4 и в PHP 5 будет работать совершенно по-разному (Пример 1, «Различие объектной модели PHP 4 и PHP 5»).

В PHP 4 переменная $obj1 будет содержать новый объект. Присвоение $obj2 = $obj1; вызовет копирование этого объекта, т. е. переменная $obj2 будет содержать новую копию первого объекта. Соответственно, изменение значения переменной $obj2->test не повлияет на переменную $obj1->test, так как они принадлежат разным объектам.

А вот в PHP 5 переменная $obj1 будет содержать идентификатор объекта; он же будет присвоен и переменной $obj2 в результате присвоения $obj2 = $obj1;. Таким образом, обе переменные будут содержать идентификатор одного и того же объекта, а $obj1->test; и $obj2->test будут представлять одну и ту же переменную.

Становится ясно, что PHP 5 нуждается в каком-то ином механизме копирования объектов.

В 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 создается одним, а его объекты клонируются другим разработчиком;
такое клонирование применяется в приложении многократно;
бонусы клиентам к столетнему юбилею банка не предусмотрены;
да, собственно, и юбилея никакого не предвидится;

...и ответьте на вопрос: "На чьем месте Вы бы предпочли оказаться - разработчиков данного приложения или клиента банка, открывающего дополнительный счет?".

Впрочем, в действительности все оказывается не таким страшным.

Еще одно нововведение PHP 5, метод __clone, если определен, при клонировании объекта автоматически вызывается для вновь созданной копии (и ни в какой ситуации не может быть вызван напрямую).

Это значит, что у разработчиков появляется возможность управлять процессом копирования. Так, например, в только что рассмотренном нами примере с банковским приложением, проблема с дублированием суммы при открытии дополнительного счета легко решается путем определения метода __clone.

class BankAccount {
    // ...

    function __clone()
    {
        $this->amount = 0;
    }
}
            

Теперь можно безбоязненно пользоваться клонированием, не заботясь более об обнулении счетов. Они будут обнуляться автоматически.

Created with DocBook Created with Libxslt


В избранное