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:


Reply via email to