Files
php-doc-ru/language/oop5/cloning.xml
2021-03-08 14:52:00 +03:00

186 lines
5.3 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 9ee9eccf455188ab6eb352194eb6f9eb99e15606 Maintainer: shein Status: ready -->
<!-- Reviewed: yes -->
<!-- $Revision$ -->
<sect1 xml:id="language.oop5.cloning" xmlns="http://docbook.org/ns/docbook">
<title>Клонирование объектов</title>
<para>
Создание копии объекта с абсолютно идентичными свойствами
не всегда является приемлемым вариантом. Хорошим примером
необходимости копирования конструкторов может послужить
ситуация, когда у вас есть объект, представляющий собой
окно GTK и содержащий ресурс-идентификатор этого окна; когда
вы создаёте копию этого объекта, вам может понадобиться,
чтобы копия объекта содержала ресурс-идентификатор
нового окна. Другим примером может послужить ситуация,
когда ваш объект содержит ссылку на какой-либо другой используемый
объект и, когда вы создаёте копию родительского объекта,
вам нужно также создать новый экземпляр этого другого объекта,
так, чтобы копия объекта-контейнера содержала собственный отдельный
экземпляр содержащегося объекта.
</para>
<para>
Копия объекта создаётся с использованием ключевого слова <literal>clone</literal>
(который вызывает метод <link linkend="object.clone">__clone()</link>
объекта, если это возможно).
</para>
<informalexample>
<programlisting>
<![CDATA[
$copy_of_object = clone $object;
]]>
</programlisting>
</informalexample>
<para>
При клонировании объекта, PHP выполняет неполную копию
всех свойств объекта. Любые свойства, являющиеся ссылками на другие
переменные, останутся ссылками.
</para>
<methodsynopsis xml:id="object.clone">
<type>void</type><methodname>__clone</methodname>
<void/>
</methodsynopsis>
<para>
После завершения клонирования, если метод
<link linkend="object.clone">__clone()</link> определён, тогда
будет вызываться метод <link linkend="object.clone">__clone()</link>
вновь созданного объекта, для возможного
изменения всех необходимых свойств.
</para>
<example>
<title>Клонирование объекта</title>
<programlisting role="php">
<![CDATA[
<?php
class SubObject
{
static $instances = 0;
public $instance;
public function __construct() {
$this->instance = ++self::$instances;
}
public function __clone() {
$this->instance = ++self::$instances;
}
}
class MyCloneable
{
public $object1;
public $object2;
function __clone()
{
// Принудительно копируем this->object, иначе
// он будет указывать на один и тот же объект.
$this->object1 = clone $this->object1;
}
}
$obj = new MyCloneable();
$obj->object1 = new SubObject();
$obj->object2 = new SubObject();
$obj2 = clone $obj;
print("Оригинальный объект:\n");
print_r($obj);
print("Клонированный объект:\n");
print_r($obj2);
?>
]]>
</programlisting>
&example.outputs;
<screen role="php">
<![CDATA[
Оригинальный объект:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 1
)
[object2] => SubObject Object
(
[instance] => 2
)
)
Клонированный объект:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 3
)
[object2] => SubObject Object
(
[instance] => 2
)
)
]]>
</screen>
</example>
<para>
Возможно обращаться к свойствам/методам только что
склонированного объекта:
</para>
<example>
<title>Доступ к только что склонированному объекту</title>
<programlisting role="php">
<![CDATA[
<?php
$dateTime = new DateTime();
echo (clone $dateTime)->format('Y');
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
2016
]]>
</screen>
</example>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->