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">
+<?php
+class foo {
+ function foo($name) {
+ // crée une référence dans le tableau global $globalref
+ global $globalref;
+ $globalref[] = &$this;
+ // donne le nom de la variable
+ $this->setName($name);
+ // et l'affiche
+ $this->echoName();
+ }
+
+ function echoName() {
+ echo "<br>",$this->Name;
+ }
+
+ function setName($name) {
+ $this->Name = $name;
+ }
+}
+?>
+ </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>=&</literal> :
+ </para>
+ <informalexample>
+ <programlisting role="php">
+<?php
+ $bar1 = new foo('crée dans le constructeur');
+ $bar1->echoName();
+ $globalref[0]->echoName();
+
+ /* affiche :
+ crée dans le constructeur
+ crée dans le constructeur
+ crée dans le constructeur */
+
+ $bar2 =&new foo('crée dans le constructeur');
+ $bar2->echoName();
+ $globalref[1]->echoName();
+
+ /* affiche :
+ crée dans le constructeur
+ crée dans le constructeur
+ crée dans le constructeur */
+?>
+ </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">
+<?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->setName('modifié');
+
+ // comme prédit, ce n'est pas le cas
+ $bar1->echoName();
+ $globalref[0]->echoName();
+
+ /* affiche :
+ crée dans le constructeur
+ modifié */
+
+ // quelle est la différence entre $bar2 et $globalref[1]
+ $bar2->setName('modifié');
+
+ // Heureusement, elles sont non seulement égales, mais
+ // elles représentent la même variable.
+ // donc $bar2->Name et $globalref[1]->Name sont les mêmes
+ $bar2->echoName();
+ $globalref[1]->echoName();
+
+ /* affiche :
+ modifié
+ modifié */
+?>
+ </programlisting>
+ </informalexample>
+ <para>
+ Un dernier exemple pour bien comprendre.
+ <informalexample>
+ <programlisting role="php">
+<?php
+class a {
+ function a($i) {
+ $this->value = $i;
+ // Essayez de comprendre on n'a pas besoin de
+ // référence ici
+ $this->b = new b($this);
+ }
+
+ function createRef() {
+ $this->c = new b($this);
+ }
+
+ function echoValue() {
+ echo "<br>","class ",get_class($this),': ',$this->value;
+ }
+}
+
+
+class b {
+
+ function b(&$a) {
+ $this->a = &$a;
+ }
+
+ function echoValue() {
+ echo "<br>","class ",get_class($this),': ',$this->a->value;
+ }
+
+}
+
+// Essayez de comprendre pourquoi une copie simple va
+// conduire à un résultat indésirable à la ligne marquée d'une étoile
+$a =&new a(10);
+$a->createRef();
+
+$a->echoValue();
+$a->b->echoValue();
+$a->c->echoValue();
+
+$a->value = 11;
+
+$a->echoValue();
+$a->b->echoValue(); // *
+$a->c->echoValue();
+
+/*
+output:
+class a: 10
+class b: 10
+class b: 10
+class a: 11
+class b: 11
+class b: 11
+*/
+?>
+ </programlisting>
+ </informalexample>
+ </para>
+ </sect1>
</chapter>
<!-- Keep this comment at the end of the file
Local variables: