Files
archived-doc-pt-br/language/oop5/cloning.xml
Leonardo Lara Rodrigues 0daf9218ca fix and improve translation
2025-06-04 10:43:47 -03:00

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
-->