mirror of
https://github.com/php/doc-pt_br.git
synced 2026-03-23 22:52:12 +01:00
179 lines
4.1 KiB
XML
Executable File
179 lines
4.1 KiB
XML
Executable File
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- EN-Revision: 28529d3539b850e870e3aa97570f4db0e53daa03 Maintainer: ae Status: ready --><!-- CREDITS: narigone,ae,fabioluciano,leonardolara -->
|
|
<sect1 xml:id="language.oop5.cloning" xmlns="http://docbook.org/ns/docbook">
|
|
<title>Clonando Objetos</title>
|
|
|
|
<para>
|
|
Criar uma cópia de um objeto com propriedades totalmente replicadas nem sempre
|
|
é o comportamento desejado. Um bom exemplo da necessidade para cópia de construtores,
|
|
e quando possuir um objeto que representa uma janela do GTK e o
|
|
objeto guarda o recurso dessa janela GTK. ao criar uma duplicata,
|
|
pode-se desejar a criação de uma nova janela com as mesmas propriedades e fazer o
|
|
novo objeto guardar o recurso da nova janela. Outro exemplo é se seu
|
|
objeto guarda uma referência a outro objeto que usa e ao
|
|
replicar o objeto pai, deseja-se que seja criada uma nova instância desse outro
|
|
objeto para que a réplica tenha sua própria cópia separada.
|
|
</para>
|
|
|
|
<para>
|
|
Uma cópia de objeto é criada usando a palavra-chave <literal>clone</literal>
|
|
(que chama o método <link linkend="object.clone">__clone()</link> do objeto,
|
|
se possível).
|
|
</para>
|
|
|
|
<informalexample>
|
|
<programlisting>
|
|
<![CDATA[
|
|
$copia_do_objeto = clone $objeto;
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
|
|
<para>
|
|
Ao clonar um objeto, o PHP fará uma cópia superficial de todas as
|
|
propriedades do objeto. Qualquer propriedade que seja referência a outra variável,
|
|
permanecerá como referência.
|
|
</para>
|
|
|
|
<methodsynopsis xml:id="object.clone">
|
|
<type>void</type><methodname>__clone</methodname>
|
|
<void/>
|
|
</methodsynopsis>
|
|
|
|
<para>
|
|
Depois que a clonagem se completa, se um método <link linkend="object.clone">__clone()</link> estiver definido,
|
|
o objeto recém criado terá seu método <link linkend="object.clone">__clone()</link> chamado, permitindo que
|
|
qualquer propriedade seja alterada.
|
|
</para>
|
|
|
|
<example>
|
|
<title>Clonando um objeto</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()
|
|
{
|
|
// Força uma cópia de this->object, caso contrário
|
|
// aponta para o mesmo objeto.
|
|
$this->object1 = clone $this->object1;
|
|
}
|
|
}
|
|
|
|
$obj = new MyCloneable();
|
|
|
|
$obj->object1 = new SubObject();
|
|
$obj->object2 = new SubObject();
|
|
|
|
$obj2 = clone $obj;
|
|
|
|
|
|
print "Objeto original:\n";
|
|
print_r($obj);
|
|
|
|
print "Objeto clonado:\n";
|
|
print_r($obj2);
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen role="php">
|
|
<![CDATA[
|
|
Objeto original:
|
|
MyCloneable Object
|
|
(
|
|
[object1] => SubObject Object
|
|
(
|
|
[instance] => 1
|
|
)
|
|
|
|
[object2] => SubObject Object
|
|
(
|
|
[instance] => 2
|
|
)
|
|
|
|
)
|
|
Objeto clonado:
|
|
MyCloneable Object
|
|
(
|
|
[object1] => SubObject Object
|
|
(
|
|
[instance] => 3
|
|
)
|
|
|
|
[object2] => SubObject Object
|
|
(
|
|
[instance] => 2
|
|
)
|
|
|
|
)
|
|
]]>
|
|
|
|
</screen>
|
|
|
|
</example>
|
|
|
|
<para>
|
|
É possível acessar um membro de um objeto recém clonado
|
|
em uma expressão única:
|
|
</para>
|
|
<example>
|
|
<title>Acessar um membro de um objeto recém clonado</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
|
|
-->
|