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: