com doc/fr: Apply commit 4317fec7555dd42621f88162cc5068092e5c5cfb: language-snippets.ent language/oop5/basic.xml language/oop5/decon.xml language/oop5/interfaces.xml

[email protected] (George Peter Banyard) Sat, 16 Jan 2021 10:26:37 +0000
Newsgroups php.doc.fr
Message-ID <[email protected]>
Commit:    666a77d26d0cc0a724c340f6373cdead17a99893
Author:    George Peter Banyard <[email protected]>         Sat, 16 Jan 2021 10:26:37 +0000
Parents:   1a4dc1ac15dd9eed05fec4cdfb4b6ea46b062b25
Branches:  master

Link:       http://git.php.net/?p=doc/fr.git;a=commitdiff;h=666a77d26d0cc0a724c340f6373cdead17a99893

Log:
Apply commit 4317fec7555dd42621f88162cc5068092e5c5cfb

Update method signature section for PHP 7/8

Changed paths:
  M  language-snippets.ent
  M  language/oop5/basic.xml
  M  language/oop5/decon.xml
  M  language/oop5/interfaces.xml
diff_666a77d26d0cc0a724c340f6373cdead17a99893.txt (text/plain, 9.6 KB)
diff --git a/language-snippets.ent b/language-snippets.ent
index 6b49ef3395..39366f1717 100644
--- a/language-snippets.ent
+++ b/language-snippets.ent
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: d278431ef5e561787093a7b2679327a615b09367  Maintainer: yannick Status: ready -->
+<!-- EN-Revision: 4317fec7555dd42621f88162cc5068092e5c5cfb  Maintainer: yannick Status: ready -->
 <!-- Reviewed: no -->
 <!-- Relecture des Notes, Précautions, Avertissements, Astuces, Divers et Retour le 2018-12-29 par girgias -->
 
@@ -568,13 +568,15 @@ xmlns="http://docbook.org/ns/docbook"><simpara>
 
 <!ENTITY example.outputs.8 '<para xmlns="http://docbook.org/ns/docbook">Résultat de l&#39;exemple ci-dessus en PHP 8 :</para>'>
 
+<!ENTITY example.outputs.8.similar '<para xmlns="http://docbook.org/ns/docbook">Résultat de l&#39;exemple ci-dessus en PHP 8 est similaire à :</para>'>
+
 <!ENTITY example.outputs.80 '<para xmlns="http://docbook.org/ns/docbook">Résultat de l&#39;exemple ci-dessus en PHP 8.0 :</para>'>
 
 <!ENTITY example.outputs.32bit '<para xmlns="http://docbook.org/ns/docbook">Résultat de l&#39;exemple ci-dessus sur une machine 32 bits :</para>'>
 
 <!ENTITY example.outputs.64bit '<para xmlns="http://docbook.org/ns/docbook">Résultat de l&#39;exemple ci-dessus sur une machine 64 bits :</para>'>
 
-<!ENTITY example.outputs.similar '<para xmlns="http://docbook.org/ns/docbook">L&#39;exemple ci-dessus va afficher quelque chose de similaire à :</para>'>
+<!ENTITY example.outputs.similar '<para xmlns="http://docbook.org/ns/docbook">Résultat de l&#39;exemple ci-dessus est similaire à :</para>'>
 
 <!ENTITY examples.outputs '<para xmlns="http://docbook.org/ns/docbook">Les exemples ci-dessus vont afficher :</para>'>
 
diff --git a/language/oop5/basic.xml b/language/oop5/basic.xml
index 90eeabc14d..0ecc4f39a3 100644
--- a/language/oop5/basic.xml
+++ b/language/oop5/basic.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: a9edd62d087ab1eb6292c795b7256e14ff9f1234 Maintainer: yannick Status: ready -->
+<!-- EN-Revision: 4317fec7555dd42621f88162cc5068092e5c5cfb Maintainer: yannick Status: ready -->
 <!-- Reviewed: no -->
  <sect1 xml:id="language.oop5.basic" xmlns="http://docbook.org/ns/docbook">
   <title>Syntaxe de base</title>
@@ -366,11 +366,6 @@ echo ($obj->bar)(), PHP_EOL;
     méthodes ou une propriétés statiques surchargées en y faisant référence avec l'opérateur
     <link linkend="language.oop5.paamayim-nekudotayim">parent::</link>.
    </para>
-   <para>
-    Lors de la surcharge de méthodes, la signature devrait rester la même ; sinon,
-    PHP génèrera une erreur de niveau <constant>E_STRICT</constant>. Ceci ne s'applique pas
-    au constructeur, qui accepte la surcharge avec des paramètres différents.
-   </para>
    <example>
     <title>Héritage simple d'une classe</title>
     <programlisting role="php">
@@ -399,6 +394,158 @@ une valeur par défaut
 ]]>
     </screen>
    </example>
+
+   <sect3 xml:id="language.oop.lsp">
+    <title>Règles de compatibilité de signature</title>
+    <para>
+     Lors de la surcharge d'une méthode, sa signature doit être compatible avec
+     la méthode parente. Sinon, une erreur fatale est émise, ou, antérieur à
+     PHP 8.0.0, une erreur de niveau <constant>E_WARNING</constant> est généré.
+     Une signature est compatible si elle respecte les règles de
+     <link linkend="language.oop5.variance">variance</link>, rend un paramètre
+     obligatoire optionnel, et si tout nouveau paramètre sont optionnels.
+     Ceci est connu sous le Principe de Substitution de Liskov
+     (Liskov Substitution Principle), ou simplement LSP.
+     Le <link linkend="language.oop5.decon.constructor">constructeur</link>,
+     et les méthodes <literal>private</literal> sont exclus de ces règles de
+     compatibilité des signatures, et par conséquent n'émettront pas d'erreur
+     fatale en cas de signature incompatible.
+    </para>
+    <example>
+     <title>Méthodes enfant compatibles</title>
+     <programlisting role="php">
+<![CDATA[
+<?php
+class Base
+{
+    public function foo(int $a) {
+        echo "Valid\n";
+    }
+}
+class Extend1 extends Base
+{
+    function foo(int $a = 5)
+    {
+        parent::foo($a);
+    }
+}
+class Extend2 extends Base
+{
+    function foo(int $a, $b = 5)
+    {
+        parent::foo($a);
+    }
+}
+$extended1 = new Extend1();
+$extended1->foo();
+$extended2 = new Extend2();
+$extended2->foo(1);
+]]>
+     </programlisting>
+     &example.outputs;
+     <screen>
+<![CDATA[
+Valid
+Valid
+]]>
+     </screen>
+    </example>
+
+    <para>
+     Les exemples suivant démontrent qu'une méthode enfant qui supprime un paramètre,
+     ou rend un paramètre optionnel obligatoire, n'est pas compatible avec la méthode parente.
+    </para>
+    <example>
+     <title>Erreur fatale quand une méthode enfant supprime un paramètre</title>
+     <programlisting role="php">
+<![CDATA[
+<?php
+class Base
+{
+    public function foo(int $a = 5) {
+        echo "Valid\n";
+    }
+}
+class Extend extends Base
+{
+    function foo()
+    {
+        parent::foo(1);
+    }
+}
+]]>
+     </programlisting>
+     &example.outputs.8.similar;
+     <screen>
+<![CDATA[
+Fatal error: Declaration of Extend::foo() must be compatible with Base::foo(int $a = 5) in /in/evtlq on line 13
+]]>
+     </screen>
+    </example>
+    <example>
+     <title>Erreur fatale quand une méthode enfant rend un paramètre optionnel obligatoire</title>
+     <programlisting role="php">
+<![CDATA[
+<?php
+class Base
+{
+    public function foo(int $a = 5) {
+        echo "Valid\n";
+    }
+}
+class Extend extends Base
+{
+    function foo(int $a)
+    {
+        parent::foo($a);
+    }
+}
+]]>
+     </programlisting>
+     &example.outputs.8.similar;
+     <screen>
+<![CDATA[
+Fatal error: Declaration of Extend::foo(int $a) must be compatible with Base::foo(int $a = 5) in /in/qJXVC on line 13
+]]>
+     </screen>
+    </example>
+
+    <warning>
+     <para>
+      Renommer un paramètre d'une méthode dans une classe enfant n'est pas
+      une incompatibilité de signature. Cependant, ceci est découragé car ceci
+      va résulter en une <classname>Error</classname> lors du runtime si les
+      <link linkend="functions.named-arguments">arguments nommées</link>
+      sont utilisés.
+     </para>
+     <example>
+      <title>Erreur lors de l'utilisation des arguments nommées et que les paramètres ont étaient renommée dans une classe enfant</title>
+      <programlisting role="php">
+<![CDATA[
+<?php
+class A {
+    public function test($foo, $bar) {}
+}
+class B extends A {
+    public function test($a, $b) {}
+}
+$obj = new B;
+// Pass parameters according to A::test() contract
+$obj->test(foo: "foo", bar: "bar"); // ERROR!
+]]>
+      </programlisting>
+      &example.outputs.similar;
+      <screen>
+<![CDATA[
+Fatal error: Uncaught Error: Unknown named parameter $foo in /in/XaaeN:14
+Stack trace:
+#0 {main}
+  thrown in /in/XaaeN on line 14
+]]>
+      </screen>
+     </example>
+    </warning>
+   </sect3>
   </sect2>
 
   <sect2 xml:id="language.oop5.basic.class.class">
diff --git a/language/oop5/decon.xml b/language/oop5/decon.xml
index ff18041b34..0d12baa682 100644
--- a/language/oop5/decon.xml
+++ b/language/oop5/decon.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: a9edd62d087ab1eb6292c795b7256e14ff9f1234 Maintainer: yannick Status: ready -->
-<!-- Reviewed: yes -->
+<!-- EN-Revision: 4317fec7555dd42621f88162cc5068092e5c5cfb Maintainer: yannick Status: ready -->
+<!-- Reviewed: no -->
  <sect1 xml:id="language.oop5.decon" xmlns="http://docbook.org/ns/docbook">
   <title>Constructeurs et destructeurs</title>
 
@@ -65,9 +65,9 @@ $obj = new OtherSubClass();
     </programlisting>
    </example>
    <para>
-    À la différence des autres méthodes, PHP ne génèrera pas d'erreur de niveau
-    <constant>E_STRICT</constant> lorsque <link linkend="object.construct">__construct()</link> est
-    surchargé avec des paramètres différents du <link linkend="object.construct">__construct()</link> parent.
+    À la différence des autres méthodes, <link linkend="object.construct">__construct()</link>
+    est exclus des <link linkend="language.oop.lsp">règles de compatibilités des signatures</link>
+    usuel quand elle est étendue.
    </para>
    <para>
     Les constructeurs sont des méthodes ordinaires qui sont appelées lors de
diff --git a/language/oop5/interfaces.xml b/language/oop5/interfaces.xml
index 5116e28a9b..1be3714771 100644
--- a/language/oop5/interfaces.xml
+++ b/language/oop5/interfaces.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- $Revision$ -->
-<!-- EN-Revision: a9edd62d087ab1eb6292c795b7256e14ff9f1234 Maintainer: yannick Status: ready -->
-<!-- Reviewed: yes -->
+<!-- EN-Revision: 4317fec7555dd42621f88162cc5068092e5c5cfb Maintainer: yannick Status: ready -->
+<!-- Reviewed: no -->
  <sect1 xml:id="language.oop5.interfaces" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
   <title>Interfaces</title>
   <para>
@@ -48,11 +48,10 @@
    </note>
    <note>
     <para>
-     La classe implémentant l'interface doit utiliser des signatures de méthodes
-     compatible avec LSP (Principe de Substitution de Liskov).
-     Dans le cas contraire, une erreur fatale sera émise.
-     </para>
-    </note>
+     Le classe implémentant l'interface doit déclarer une méthode qui a une
+     <link linkend="language.oop.lsp">signature compatible</link>.
+    </para>
+   </note>
   </sect2>
   <sect2 xml:id="language.oop5.interfaces.constants">
    <title><literal>Les constantes</literal></title>