Skip to content

Commit

Permalink
Add readonly docs to French
Browse files Browse the repository at this point in the history
Probably will fix build issue
  • Loading branch information
Girgias committed Nov 30, 2021
1 parent de45aac commit 2bd69c5
Showing 1 changed file with 154 additions and 3 deletions.
157 changes: 154 additions & 3 deletions language/oop5/properties.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 9ee9eccf455188ab6eb352194eb6f9eb99e15606 Maintainer: yannick Status: ready -->
<!-- EN-Revision: d73c3dcbd6e2b085781115aa42d17b80ea285b9e Maintainer: yannick Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.oop5.properties" xmlns="http://docbook.org/ns/docbook">
<title>Propriétés</title>
Expand Down Expand Up @@ -189,7 +188,159 @@ Fatal error: Uncaught Error: Typed property Shape::$numberOfSides must not be ac
</para>
</sect2>

</sect1>
<sect2 xml:id="language.oop5.properties.readonly-properties">
<title>Propriétés en lecture seule (readonly)</title>
<para>
À partir de PHP 8.1.0, une propriété peut être déclaré avec le modificateur <code>readonly</code>,
qui empêche la modification de la propriété après l'initialisation.
<example>
<title>Exemple de propriétés en lecture seule</title>
<programlisting role="php">
<![CDATA[
<?php
class Test {
public readonly string $prop;
public function __construct(string $prop) {
// Initialization légale.
$this->prop = $prop;
}
}
$test = new Test("foobar");
// Lecture légale.
var_dump($test->prop); // string(6) "foobar"
// Réaffectation illégal. Ce n'importe pas que la valeur assigné soit identique.
$test->prop = "foobar";
// Error: Cannot modify readonly property Test::$prop
?>
]]>
</programlisting>
</example>
<note>
<para>
Le modificateur de lecture seule ne peut être appliqué que aux
<link linkend="language.oop5.properties.typed-properties">propriétés typées</link>.
Une propriété en lecture seule sans contrainte de type peut être crée en
utilisant le type <xref linkend="language.types.declarations.mixed" />.
</para>
</note>
<note>
<para>
Les propriétés statiques en lecture seule ne sont pas supportées.
</para>
</note>
</para>
<para>
Une propriété en lecture seule ne peut être initialisé qu'une seule fois,
et seulement depuis la porté dans laquelle elle a été déclaré.
Tout autre affectation ou modification de la propriété résultera en une
exception <classname>Error</classname>.
<example>
<title>Initialisation illégale de propriétés en lecture seule</title>
<programlisting role="php">
<![CDATA[
<?php
class Test1 {
public readonly string $prop;
}
$test1 = new Test1;
// Initialisation illégale en dehors de la portée privée.
$test1->prop = "foobar";
// Error: Cannot initialize readonly property Test1::$prop from global scope
?>
]]>
</programlisting>
</example>
</para>
<note>
<para>
Spécifier une valeur par défaut explicite à une propriété en lecture seule
n'est pas autorisé, car une propriété en lecture seule avec une valeur par
défaut est essentiellement identique à une constante, et par conséquent
pas particulièrement utile.
<example>
<programlisting role="php">
<![CDATA[
<?php
class Test {
// Fatal error: Readonly property Test::$prop cannot have default value
public readonly int $prop = 42;
}
?>
]]>
</programlisting>
</example>
</para>
</note>
<note>
<para>
Les propriétés en lecture seule ne peuvent pas être
<function>unset</function> une fois qu'elles ont été initialisé.
Cependant, il est possible de unset une propriété en lecture seule avant
son initialisation, depuis la portée où la propriété a été déclaré.
</para>
</note>
<para>
Les modifications ne sont pas nécessairement des affectations simple,
tout les exemples suivant résulteront en une exception <classname>Error</classname> :
<example>
<programlisting role="php">
<![CDATA[
<?php
class Test {
public function __construct(
public readonly int $i = 0,
public readonly array $ary = [],
) {}
}
$test = new Test;
$test->i += 1;
$test->i++;
++$test->i;
$test->ary[] = 1;
$test->ary[0][] = 1;
$ref =& $test->i;
$test->i =& $ref;
byRef($test->i);
foreach ($test as &$prop);
?>
]]>
</programlisting>
</example>
</para>
<para>
Cependant, les propriétés en lectures seule n'exclus pas la mutabilité intérieure.
Les objets (ou ressources) stocké dans les propriétés en lectures seules
peuvent toujours être modifié en interne :
<example>
<programlisting role="php">
<![CDATA[
<?php
class Test {
public function __construct(public readonly object $obj) {}
}
$test = new Test(new stdClass);
// Mutation interne légale.
$test->obj->foo = 1;
// Réaffectation illégale.
$test->obj = new stdClass;
?>
]]>
</programlisting>
</example>
</para>
</sect2>

</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
Expand Down

0 comments on commit 2bd69c5

Please sign in to comment.