[PHP-DOC] cvs: phpdoc /fr/language oop.xml From: Damien Seguy (dams <email protected>)
Date: 03/12/01

dams Mon Mar 12 04:12:37 2001 EDT

  Modified files:
    /phpdoc/fr/language oop.xml
  Log:
  Added new sections about references and constructors
  
Index: phpdoc/fr/language/oop.xml
diff -u phpdoc/fr/language/oop.xml:1.8 phpdoc/fr/language/oop.xml:1.9
--- phpdoc/fr/language/oop.xml:1.8 Tue Mar 6 10:31:37 2001
+++ phpdoc/fr/language/oop.xml Mon Mar 12 04:12:37 2001
@@ -193,6 +193,180 @@
     </simpara>
    </caution>
   </sect1>
+ <sect1 id="keyword.newref">
+ <title>Références dans un constructeur</title>
+ <para>
+ Créer des références dans un constructeur peut conduire à
+ des résultats étranges. Ce tutorial vous guide pour éviter ces
+ problèmes.
+ <informalexample>
+ <programlisting role="php">
+&lt;?php
+class foo {
+ function foo($name) {
+ // crée une référence dans le tableau global $globalref
+ global $globalref;
+ $globalref[] = &amp;$this;
+ // donne le nom de la variable
+ $this-&gt;setName($name);
+ // et l'affiche
+ $this-&gt;echoName();
+ }
+
+ function echoName() {
+ echo "&lt;br&gt;",$this-&gt;Name;
+ }
+
+ function setName($name) {
+ $this-&gt;Name = $name;
+ }
+}
+?&gt;
+ </programlisting>
+ </informalexample>
+ </para>
+ <para>
+ Vérifions maintenant qu'il y a une différence entre <varname>$bar1</varname>
+ qui a été créé avec <literal>=</literal> et <varname>$bar2</varname> qui a été
+ créé avec l'opérateur de référence <literal>=&amp;</literal> :
+ </para>
+ <informalexample>
+ <programlisting role="php">
+&lt;?php
+ $bar1 = new foo('crée dans le constructeur');
+ $bar1-&gt;echoName();
+ $globalref[0]-&gt;echoName();
+
+ /* affiche :
+ crée dans le constructeur
+ crée dans le constructeur
+ crée dans le constructeur */
+
+ $bar2 =&amp;new foo('crée dans le constructeur');
+ $bar2-&gt;echoName();
+ $globalref[1]-&gt;echoName();
+
+ /* affiche :
+ crée dans le constructeur
+ crée dans le constructeur
+ crée dans le constructeur */
+?&gt;
+ </programlisting>
+ </informalexample>
+ <para>
+ Apparement, il n'y a pas de différence, mais en fait, il y en a une
+ significative : <varname>$bar1</varname> et <varname>$globalref[0]</varname>
+ ne sont pas référencées, ces deux variables sont différentes.
+ Cela est du au fait que l'opérateur "new"ne retourne par de référence,
+ mais retourne une copie.
+ <note>
+ <simpara>
+ Il n'y a aucune perte de performance (puisque PHP 4 utilise un compteur de
+ référence) à retourner des copies au lieu de références. Au contraire, il est
+ souvent mieux de travailler sur les copies plutôt que sur les références,
+ car créer une référence prend un peu plus de temps que de créer une copie
+ qui ne prend virtuellement pas de temps (à moins qu'il ne se crée un
+ tableau géant ou un objet monstreux, auquel cas il est préférable de passer
+ par des références).
+ </simpara>
+ </note>
+ Pour prouver ceci, regardez le code suivant :
+ </para>
+ <informalexample>
+ <programlisting role="php">
+&lt;?php
+ // maintenant, nous allons changer de nom. Qu'attendez vous?
+ // Vous pouvez vous attendre à ce que les deux variables $bar
+ // et $globalref[0] change de nom...
+ $bar1-&gt;setName('modifié');
+
+ // comme prédit, ce n'est pas le cas
+ $bar1-&gt;echoName();
+ $globalref[0]-&gt;echoName();
+
+ /* affiche :
+ crée dans le constructeur
+ modifié */
+
+ // quelle est la différence entre $bar2 et $globalref[1]
+ $bar2-&gt;setName('modifié');
+
+ // Heureusement, elles sont non seulement égales, mais
+ // elles représentent la même variable.
+ // donc $bar2-&gt;Name et $globalref[1]-&gt;Name sont les mêmes
+ $bar2-&gt;echoName();
+ $globalref[1]-&gt;echoName();
+
+ /* affiche :
+ modifié
+ modifié */
+?&gt;
+ </programlisting>
+ </informalexample>
+ <para>
+ Un dernier exemple pour bien comprendre.
+ <informalexample>
+ <programlisting role="php">
+&lt;?php
+class a {
+ function a($i) {
+ $this-&gt;value = $i;
+ // Essayez de comprendre on n'a pas besoin de
+ // référence ici
+ $this-&gt;b = new b($this);
+ }
+
+ function createRef() {
+ $this-&gt;c = new b($this);
+ }
+
+ function echoValue() {
+ echo "&lt;br&gt;","class ",get_class($this),': ',$this-&gt;value;
+ }
+}
+
+
+class b {
+
+ function b(&amp;$a) {
+ $this-&gt;a = &amp;$a;
+ }
+
+ function echoValue() {
+ echo "&lt;br&gt;","class ",get_class($this),': ',$this-&gt;a-&gt;value;
+ }
+
+}
+
+// Essayez de comprendre pourquoi une copie simple va
+// conduire à un résultat indésirable à la ligne marquée d'une étoile
+$a =&amp;new a(10);
+$a-&gt;createRef();
+
+$a-&gt;echoValue();
+$a-&gt;b-&gt;echoValue();
+$a-&gt;c-&gt;echoValue();
+
+$a-&gt;value = 11;
+
+$a-&gt;echoValue();
+$a-&gt;b-&gt;echoValue(); // *
+$a-&gt;c-&gt;echoValue();
+
+/*
+output:
+class a: 10
+class b: 10
+class b: 10
+class a: 11
+class b: 11
+class b: 11
+*/
+?&gt;
+ </programlisting>
+ </informalexample>
+ </para>
+ </sect1>
  </chapter>
  <!-- Keep this comment at the end of the file
  Local variables: