Skip to content

Commit

Permalink
sync with en rev
Browse files Browse the repository at this point in the history
  • Loading branch information
leonardolara committed Nov 21, 2024
1 parent 3db0370 commit 6b38bd8
Show file tree
Hide file tree
Showing 10 changed files with 306 additions and 30 deletions.
8 changes: 5 additions & 3 deletions appendices/reserved.constants.core.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 1cd6b918cff0e3703b02d206add32be075cc682f Maintainer: ae Status: ready --><!-- CREDITS: narigone,adiel,geekcom,ae,leonardolara -->
<!-- EN-Revision: b2fa00ca2e052f87785a7f8b296466edc4e55767 Maintainer: ae Status: ready --><!-- CREDITS: narigone,adiel,geekcom,ae,leonardolara -->
<sect2 xml:id="reserved.constants.core" xmlns="http://docbook.org/ns/docbook">
<title>Principais Constantes Predefinidas</title>
<simpara>
Expand Down Expand Up @@ -105,7 +105,8 @@
<varlistentry xml:id="constant.php-zts">
<term>
<constant>PHP_ZTS</constant>
(<type>int</type>)
(<type>bool</type>)
&Alias; <constant>ZEND_THREAD_SAFE</constant>
</term>
<listitem>
<simpara>
Expand All @@ -116,7 +117,8 @@
<varlistentry xml:id="constant.php-debug">
<term>
<constant>PHP_DEBUG</constant>
(<type>int</type>)
(<type>bool</type>)
&Alias; <constant>ZEND_DEBUG_BUILD</constant>
</term>
<listitem>
<simpara>
Expand Down
8 changes: 7 additions & 1 deletion language/constants.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 5a945dfef09a9595c83855cdb858ffa4a96af305 Maintainer: ae Status: ready --><!-- CREDITS: ae,thiago,lcobucci,fabioluciano,lisaldo,geekcom,gabrielsanva -->
<!-- EN-Revision: f9dabdea3f92ea77cf5077020a3e945951fdc9db Maintainer: ae Status: ready --><!-- CREDITS: ae,thiago,lcobucci,fabioluciano,lisaldo,geekcom,gabrielsanva,leonardolara -->
<chapter xml:id="language.constants" xmlns="http://docbook.org/ns/docbook">
<title>Constantes</title>

Expand Down Expand Up @@ -321,6 +321,12 @@ echo ANIMAIS[1]; // imprime "gato"
O nome do método da classe.
</entry>
</row>
<row xml:id="constant.property">
<entry><constant>__PROPERTY__</constant></entry>
<entry>
Válido somente dentro de um <link linkend="language.oop5.property-hooks">gancho de propriedade</link>. É igual ao nome da propriedade.
</entry>
</row>
<row xml:id="constant.namespace">
<entry><constant>__NAMESPACE__</constant></entry>
<entry>
Expand Down
3 changes: 2 additions & 1 deletion language/oop5.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: c0fa5077c8862405942d8aac7360c5169558b59b Maintainer: ae Status: ready --><!-- CREDITS: narigone,ae,felipe -->
<!-- EN-Revision: f9dabdea3f92ea77cf5077020a3e945951fdc9db Maintainer: ae Status: ready --><!-- CREDITS: narigone,ae,felipe,leonardolara -->
<chapter xml:id="language.oop5" xmlns="http://docbook.org/ns/docbook">
<title>Classes e Objetos</title>

Expand All @@ -26,6 +26,7 @@

&language.oop5.basic;
&language.oop5.properties;
&language.oop5.property-hooks;
&language.oop5.constants;
&language.oop5.autoload;
&language.oop5.decon;
Expand Down
86 changes: 79 additions & 7 deletions language/oop5/abstract.xml
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 9ee9eccf455188ab6eb352194eb6f9eb99e15606 Maintainer: ae Status: ready --><!-- CREDITS: narigone,ae,fabioluciano,geekcom -->
<!-- EN-Revision: 2e7c00fd314a708ecbd495ef7cc9ae8c8462c33c Maintainer: ae Status: ready --><!-- CREDITS: narigone,ae,fabioluciano,geekcom,leonardolara -->
<sect1 xml:id="language.oop5.abstract" xmlns="http://docbook.org/ns/docbook">
<title>Abstração de Classes</title>

<para>
O PHP possui métodos e classes abstratas. Classes definidas como
O PHP possui métodos, classes e propriedades abstratas. Classes definidas como
abstratas não podem ser instanciadas, e qualquer classe que
contenha ao menos um método abstrato também deve ser abstrata. Métodos
são definidos como abstratos declarando a intenção em sua assinatura, e não podem
definir a implementação.
contenha ao menos um método abstrato ou uma propriedade abstrata também deve ser abstrata.
Métodos definidos como abstratos simplesmente declaram a assinatura e se ele é público ou protegido;
eles não podem definir a implementação. Propriedade definidas como abstratas
podem declarar um requisito para o comportamento de <literal>get</literal> ou <literal>set</literal>,
e podem fornecer uma implementação para uma das operações, mas não para ambas.
</para>

<para>
Expand All @@ -19,8 +21,18 @@
<link linkend="language.oop.lsp">compatibilidade de assinatura</link>.
</para>

<simpara>
A partir do PHP 8.4, uma classe abstrata pode declarar uma propriedade abstrata, seja pública ou protegida.
Uma propriedade abstrata protegida pode ser satisfeita por uma propriedade que pode ser lida/gravada no
escopo protegido ou público.
</simpara>
<simpara>
Uma propriedade abstrata pode ser satisfeita por uma propriedade padrão ou por uma propriedade
com <link linkend="language.oop5.property-hooks">ganchos</link> definidos, correspondentes à operação necessária.
</simpara>

<example>
<title>Exemplo de classe abstrata</title>
<title>Exemplo de método abstrato</title>
<programlisting role="php">
<![CDATA[
<?php
Expand Down Expand Up @@ -80,7 +92,7 @@ FOO_ConcreteClass2
</example>

<example>
<title>Exemplo de classe abstrata</title>
<title>Exemplo de método abstrato</title>
<programlisting role="php">
<![CDATA[
<?php
Expand Down Expand Up @@ -121,6 +133,66 @@ Mrs. Pacwoman
]]>
</screen>
</example>
<example>
<title>Exemplo de propriedade abstrata</title>
<programlisting role="php">
<![CDATA[
<?php
abstract class A
{
// A extensão de classes deve ter uma propriedade que pode ser obtida publicamente.
abstract public string $readable { get; }
// A extensão de classes deve ter uma propriedade gravável protegida ou pública.
abstract protected string $writeable { set; }
// A extensão de classes deve ter uma propriedade simétrica protegida ou pública.
abstract protected string $both { get; set; }
}
class C extends A
{
// Isto satisfaz o requisito e também o torna configurável, o que é válido.
public string $readable;
// Isso NÃO satisfaria o requisito, pois não é legível publicamente.
protected string $readable;
// Isso satisfaz exatamente o requisito, portanto é suficiente.
// Pode ser alterado, somente a partir do escopo protegido.
protected string $writeable {
set => $value;
}
// Isso expande a visibilidade de protegida para pública, o que é aceitável.
public string $both;
}
?>
]]>
</programlisting>
</example>
<simpara>
Uma propriedade abstrata em uma classe abstrata pode fornecer implementações para qualquer gancho,
mas deve ter <literal>get</literal> ou <literal>set</literal> declarado, mas não definido (como no exemplo acima).
</simpara>
<example>
<title>Exemplo de propriedade abstrata</title>
<programlisting role="php">
<![CDATA[
<?php
abstract class A
{
// Isso fornece uma implementação de conjunto padrão (mas substituível)
// e requer que classes filhas forneçam uma implementação get.
abstract public string $foo {
get;
set { $this->foo = $value };
}
}
?>
]]>
</programlisting>
</example>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
Expand Down
14 changes: 8 additions & 6 deletions language/oop5/basic.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 1d92bcca7524c50fc41056ea4c04e1032eb9e055 Maintainer: ae Status: ready --><!-- CREDITS: ae,amandavale,narigone,fabioluciano,lhsazevedo,leonardolara -->
<!-- EN-Revision: 2f85d57a0b5a01b875cbca2b291f04389cf61ac2 Maintainer: ae Status: ready --><!-- CREDITS: ae,amandavale,narigone,fabioluciano,lhsazevedo,leonardolara -->

<sect1 xml:id="language.oop5.basic" xmlns="http://docbook.org/ns/docbook">
<title>O básico</title>
Expand All @@ -13,11 +13,13 @@
de propriedades e métodos pertencentes à classe.
</para>
<para>
O nome de uma classe tem de ser válido, que não seja
uma <link linkend="reserved">palavra reservada do PHP</link>. Um nome de classe válido
começa com uma letra ou sublinhado, seguido de qualquer sequência de
letras, números e sublinhados. Como uma expressão regular,
pode ser expressada assim:
O nome de uma classe pode ser qualquer identificador válido, que não seja
uma <link linkend="reserved">palavra reservada</link> do PHP.
A partir do PHP 8.4.0, usar um único sublinhado <literal>_</literal> como
nome de classe foi descontinuado.
Um nome de classe válido começa com uma letra ou sublinhado,
seguido de qualquer sequência de letras, números e sublinhados.
Como uma expressão regular, pode ser expressada assim:
<code>^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$</code>.
</para>
<para>
Expand Down
87 changes: 84 additions & 3 deletions language/oop5/interfaces.xml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 3d522c890d98c563bb283cf89ec5da5f535cfb8f Maintainer: ae Status: ready --><!-- CREDITS: felipe,narigone,fabioluciano,ae -->
<!-- EN-Revision: 2e7c00fd314a708ecbd495ef7cc9ae8c8462c33c Maintainer: ae Status: ready --><!-- CREDITS: felipe,narigone,fabioluciano,ae,leonardolara -->
<sect1 xml:id="language.oop5.interfaces" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Interfaces de Objetos</title>
<para>
Interfaces de objetos permitem a criação de códigos que especificam quais métodos
uma classe deve implementar, sem definir como esses métodos serão
Interfaces de objetos permitem a criação de códigos que especificam quais métodos e propriedades
uma classe deve implementar, sem definir como esses métodos ou propriedades serão
implementados. Interfaces compartilham o namespace com classes e traits, então eles
não podem usar os mesmos nomes.
</para>
Expand Down Expand Up @@ -89,6 +89,87 @@
não podem ser sobrescritas por uma classe/interface herdeira.
</para>
</sect2>
<sect2 xml:id="language.oop5.interfaces.properties">
<title>Propriedades</title>
<simpara>
A partir do PHP 8.4.0, as interfaces também podem declarar propriedades.
Se o fizerem, a declaração deverá especificar se a propriedade deve ser legível,
gravável ou ambas.
A declaração da interface se aplica apenas ao acesso público de leitura e gravação.
</simpara>
<simpara>
Uma classe pode satisfazer uma propriedade de interface de diversas maneiras.
Pode definir uma propriedade pública.
Pode definir uma
<link linkend="language.oop5.property-hooks.virtual">propriedade virtual</link> pública
que implementa apenas o gancho correspondente.
Ou uma propriedade de leitura pode ser satisfeita por uma propriedade <literal>readonly</literal>.
Entretanto, uma propriedade de interface configurável não pode ser <literal>somente leitura</literal>.
</simpara>
<example>
<title>Exemplo de propriedades de interface</title>
<programlisting role="php">
<![CDATA[
<?php
interface I
{
// Uma classe de implementação DEVE ter uma propriedade legível publicamente,
// mas ser ou não configurável publicamente é irrestrito.
public string $readable { get; }
// Uma classe de implementação DEVE ter uma propriedade gravável publicamente,
// mas ser ou não legível publicamente é irrestrito.
public string $writeable { set; }
// Uma classe de implementação DEVE ter uma propriedade que seja
// tanto legível quanto gravável publicamente.
public string $both { get; set; }
}
// Esta classe implementa todas as três propriedades como propriedades tradicionais
// e sem ganchos; Isso é totalmente válido.
class C1 implements I
{
public string $readable;
public string $writeable;
public string $both;
}
// Esta classe implementa todas as três propriedades usando apenas os
// ganchos solicitados. Isto também é inteiramente válido.
class C2 implements I
{
private string $written = '';
private string $all = '';
// Usa apenas um gancho get para criar uma propriedade virtual.
// Isso satisfaz o requisito "public get".
// Não é gravável, mas não é exigido pela interface.
public string $readable { get => strtoupper($this->writeable); }
// A interface requer apenas que a propriedade seja configurável,
// mas incluir operações get também é totalmente válido.
// Este exemplo cria uma propriedade virtual, o que é aceitável.
public string $writeable {
get => $this->written;
set => $value;
}
// Esta propriedade exige que tanto a leitura quanto a gravação
// sejam possíveis, portanto, precisamos implementar ambas ou
// permitir que ela tenha o comportamento padrão.
public string $both {
get => $this->all;
set => strtoupper($value);
}
}
?>
]]>
</programlisting>
</example>
</sect2>
<sect2 xml:id="language.oop5.interfaces.examples">
&reftitle.examples;
<example xml:id="language.oop5.interfaces.examples.ex1">
Expand Down
59 changes: 57 additions & 2 deletions language/oop5/variance.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 76874c0982c06b2cdfeb12427bb319e34c6066d8 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<!-- EN-Revision: 2e7c00fd314a708ecbd495ef7cc9ae8c8462c33c Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
<sect1 xml:id="language.oop5.variance" xmlns="http://docbook.org/ns/docbook">
<title>Covariância e Contravariância</title>

Expand All @@ -10,7 +10,7 @@
</para>
<para>
Covariância permite que um método filho retorne um tipo mais específico que o tipo de retorno
de seu método pai. Enquanto que a contravariância permite a um parâmetro ter um tipo menos
de seu método pai. A contravariância permite a um parâmetro ter um tipo menos
específico em um método filho, em relação ao método pai.
</para>
<para>
Expand Down Expand Up @@ -242,6 +242,61 @@ Fatal error: Uncaught TypeError: Argument 1 passed to Animal::eat() must be an i
</screen>
</informalexample>
</sect2>
<sect2>
<title>Variância de propriedade</title>
<simpara>
Por padrão, as propriedades não são covariantes nem contravariantes e, portanto, invariantes.
Ou seja, o tipo delas não pode mudar em nenhuma classe filha.
A razão para isso é que as operações "get" devem ser covariantes
e as operações "set" devem ser contravariantes.
A única maneira de uma propriedade satisfazer ambos os requisitos é ser invariante.
</simpara>
<simpara>
A partir do PHP 8.4.0, com a adição de propriedades abstratas (em uma interface ou classe abstrata) e
<link linkend="language.oop5.property-hooks.virtual">propriedades virtuais</link>,
é possível declarar uma propriedade que possui apenas uma operação get ou set.
Como resultado, propriedades abstratas ou propriedades virtuais que exigem apenas uma operação "get" podem ser covariantes.
Da mesma forma, uma propriedade abstrata ou propriedade virtual que requerem apenas uma operação "set" pode ser contravariante.
</simpara>
<simpara>
Uma vez que uma propriedade tenha uma operação get e set, entretanto,
ela não será mais covariante ou contravariante para extensão adicional.
Ou seja, agora é invariante.
</simpara>
<example>
<title>Variância do tipo propriedade</title>
<programlisting role="php">
<![CDATA[
<?php
class Animal {}
class Dog extends Animal {}
class Poodle extends Dog {}
interface PetOwner
{
// Apenas uma operação get é necessária, portanto isso pode ser covariante.
public Animal $pet { get; }
}
class DogOwner implements PetOwner
{
// Este pode ser um tipo mais restritivo, já que o lado "get"
// ainda retorna um Animal. Porém, como propriedade nativa,
// os filhos desta classe não podem mais alterar o tipo.
public Dog $pet;
}
class PoodleOwner extends DogOwner
{
// Isso NÃO É PERMITIDO, porque DogOwner::$pet tem operações
// get e set definidas e obrigatórias.
public Poodle $pet;
}
?>
]]>
</programlisting>
</example>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
Expand Down
Loading

0 comments on commit 6b38bd8

Please sign in to comment.