sync with en rev

This commit is contained in:
leonardolara
2024-12-16 11:42:33 -03:00
parent e80bdaa4f6
commit fe0c742c14
3 changed files with 135 additions and 29 deletions

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: ced6d2c2bacc02e3048abd4a2ab58d755d09307d Maintainer: leonardolara Status: ready --><!-- CREDITS: felipe, thiago, rogeriopradoj, leonardolara -->
<!-- EN-Revision: 7d2dd02b7bdd1f1c3becbe06444c354f5e6f0e34 Maintainer: leonardolara Status: ready --><!-- CREDITS: felipe, thiago, rogeriopradoj, leonardolara -->
<info xmlns="http://docbook.org/ns/docbook" xml:id="bookinfo">
&frontpage.authors;
@@ -17,13 +17,6 @@
A última versão está disponível atualmente em
<link xlink:href="&url.cc.by;">&url.cc.by;</link>.
</simpara>
<simpara>
Se você está interessado na redistribuição ou republicação deste documento
como um todo ou em parte, modificado ou não, ou se você tem dúvidas,
basta contatar os responsáveis pelo copyright em
<link xlink:href="mailto:&email.php.doc.license;">&email.php.doc.license;</link>.
Note que este endereço tem suas mensagens preservadas em um arquivo público.
</simpara>
</legalnotice>
</info>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: b34210e11d0922cb14a134e244cb5846a3d2ac67 Maintainer: leonardolara Status: ready -->
<!-- EN-Revision: c925e1a0ce0659ee1c12d80f9a4a58b10cc4222f Maintainer: leonardolara Status: ready -->
<sect1 xml:id="language.oop5.property-hooks" xmlns="http://docbook.org/ns/docbook">
<title>Ganchos de Propriedade</title>
@@ -199,6 +199,72 @@ class Example
Em uma propriedade apoiada, omitir um gancho <literal>get</literal> ou<literal>set</literal>
significa que o comportamento padrão de leitura ou gravação será usado.
</simpara>
<note>
<simpara>
Gachos podem ser definidos ao usar
<link linkend="language.oop5.decon.constructor.promotion">promoção de propriedade de construtor</link>.
No entando, quando isso é feito, os valores fornecidos
ao construtor precisam ter o tipo associado à propriedade correspondido,
independentemente do que o gancho <literal>set</literal> possa permitir.
</simpara>
<simpara>
Considere o seguinte:
</simpara>
<programlisting role="php">
<![CDATA[
class Example
{
public function __construct(
public private(set) DateTimeInterface $created {
set (string|DateTimeInterface $value) {
if (is_string($value)) {
$value = new DateTimeImmutable($value);
}
$this->created = $value;
}
},
) {
}
}
]]>
</programlisting>
<simpara>
Internamente, o mecanismo decompõe para o seguinte:
</simpara>
<programlisting role="php">
<![CDATA[
class Example
{
public private(set) DateTimeInterface $created {
set (string|DateTimeInterface $value) {
if (is_string($value)) {
$value = new DateTimeImmutable($value);
}
$this->created = $value;
}
}
public function __construct(
DateTimeInterface $created,
) {
$this->created = $created;
}
}
]]>
</programlisting>
<simpara>
Quaisquer tentativas de definir a propriedade fora do construtor
permitirão valores do tipo <type>string</type> ou <interfacename>DateTimeInterface</interfacename>
mas o construtor permitirá apenas <interfacename>DateTimeInterface</interfacename>.
Isto acontece porque o tipo definido para a propriedade (<interfacename>DateTimeInterface</interfacename>)
é usado como o tipo do parâmetro dentro da assinatura do construtor, não importando o que
o gancho <literal>set</literal> permite.
</simpara>
<simpara>
Se este tipo de comportamento do construtor for necessário, a promoção de
propriedade de construtor não pode ser usada.
</simpara>
</note>
</sect2>
<sect2 xml:id="language.oop5.property-hooks.virtual">
<title>Propriedades virtuais</title>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 6564f8d246764451b71234921ed156376a4b4219 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<!-- EN-Revision: b5f0c19bec9f70f1cbdc1480b3f3c92c608489d1 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<sect1 xml:id="language.oop5.traits" xmlns="http://docbook.org/ns/docbook">
<title>Traits</title>
<para>
@@ -420,12 +420,21 @@ class C2
use Counter;
}
$o = new C1(); $o->inc(); // exibe 1
$p = new C2(); $p->inc(); // exibe 1
$o = new C1();
$o->inc();
$p = new C2();
$p->inc();
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
1
1
]]>
</screen>
</example>
<example xml:id="language.oop5.traits.static.ex2">
<title>Métodos Estáticos</title>
@@ -446,41 +455,67 @@ class Example
use StaticExample;
}
Example::doSomething();
echo Example::doSomething();
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Fazendo algo
]]>
</screen>
</example>
<example xml:id="language.oop5.traits.static.ex3">
<title>Propriedades Estáticas</title>
<caution>
<simpara>
Antes do PHP 8.3.0, propriedades estáticas definidas em um trait eram compartilhadas por um única hierarquia de classes
que usavam o trait. A partir do PHP 8.3.0, a propriedade estática do trait inserida na classe filha
substitui a propriedade estática que a classe filha herdou da classe pai deinida em conjunto com
o mesmo trait.
Antes do PHP 8.3.0, propriedades estáticas definidas em um trait eram compartilhadas
por todas as classes na mesma herança hierárquica que usavam o trait.
A partir do PHP 8.3.0, se uma classe filha usa um trait com uma propriedade estática,
ela será considerada distinta daquela definida na classe pai.
</simpara>
</caution>
<programlisting role="php">
<![CDATA[
<?php
trait StaticExample
trait T
{
public static $static = 'foo';
public static $counter = 1;
}
class Example
class A
{
use StaticExample;
use T;
public static function incrementCounter()
{
static::$counter++;
}
}
echo Example::$static;
class B extends A
{
use T;
}
A::incrementCounter();
echo A::$counter, "\n";
echo B::$counter, "\n";
?>
]]>
</programlisting>
&example.outputs.83;
<screen>
<![CDATA[
2
1
]]>
</screen>
</example>
</sect2>
@@ -562,10 +597,16 @@ class ConstantsExample {
}
$example = new ConstantsExample;
echo $example::FLAG_MUTABLE; // 1
echo $example::FLAG_MUTABLE;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
1
]]>
</screen>
</example>
<para>
Se uma Trait define uma constante, uma classe não pode definir uma constante com
@@ -596,8 +637,10 @@ class ConstantsExample {
<title>Métodos finais</title>
<simpara>
A partir do PHP 8.3.0, o modificador <link linkend="language.oop5.final">final</link>
pode ser aplicado a métodos importados de traits com o uso do operador <literal>as</literal>,
que permite a modificação da visibilidade de método originária do trait na classe onde ele é usado.
pode ser aplicado, com o uso do operador <literal>as</literal>,
a métodos importados de traits. Isto pode ser usado para evitar que classes filhas
substituam o método. Entretanto, a classe que usa o trait ainda poderá
substituir o método.
</simpara>
<example xml:id="language.oop5.traits.final-methods.example">
<title>Definindo um método originário de um trait como <literal>final</literal></title>
@@ -616,20 +659,24 @@ trait ConstantsTrait
class FinalExampleA
{
use CommonTrait {
CommonTrait::method as final; // O 'final' evita que classes filhas
// substituam o método
CommonTrait::method as final; // O 'final' evita que classes filhas substituam o método
}
}
class FinalExampleB extends FinalExampleA
{
public function method() {} // Fatal error: Cannot override final method
// FinalExampleA::method()
public function method() {}
}
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
Fatal error: Cannot override final method FinalExampleA::method() in ...
]]>
</screen>
</example>
</sect2>