cvs: phpdoc-it /language oop.xml

From: Date: Fri, 03 Jun 2005 11:55:56 +0000
Subject: cvs: phpdoc-it /language oop.xml
Groups: php.doc.it 
Request: Send a blank email to doc-it+get-725@lists.php.net to get a copy of this message
darvina Fri Jun 3 07:55:56 2005 EDT Modified files: /phpdoc-it/language oop.xml Log: Sync to En tree

http://cvs.php.net/diff.php/phpdoc-it/language/oop.xml?r1=1.15&r2=1.16&ty=u Index: phpdoc-it/language/oop.xml diff -u phpdoc-it/language/oop.xml:1.15 phpdoc-it/language/oop.xml:1.16 --- phpdoc-it/language/oop.xml:1.15 Tue Jul 1 19:42:46 2003 +++ phpdoc-it/language/oop.xml Fri Jun 3 07:55:52 2005 @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="iso-8859-1"?> -<!-- EN-Revision: 1.43 Maintainer: alan_dangelo Status: ready --> +<!-- EN-Revision: 1.62 Maintainer: alan_dangelo Status: ready --> <chapter id="language.oop"> - <title>Classi e Oggetti</title> + <title>Classi e Oggetti (PHP 4)</title> <sect1 id="keyword.class"> <title><literal>Classi</literal></title> @@ -14,24 +14,24 @@ <programlisting role="php"> <![CDATA[ <?php -class Cart -{ +class Cart { var $items; // Articoli nel carrello // Aggiunge $num articoli di $artnr nel carrello - function add_item ($artnr, $num) - { + function add_item ($artnr, $num) { $this->items[$artnr] += $num; } // Prende $num articoli di $artnr e li rimuove dal carrello - function remove_item ($artnr, $num) - { + function remove_item ($artnr, $num) { if ($this->items[$artnr] > $num) { $this->items[$artnr] -= $num; return true; + } elseif ($this->items[$artnr] == $num) { + unset($this->items[$artnr]); + return true; } else { return false; } @@ -52,11 +52,13 @@ <warning> <simpara> <emphasis>NON</emphasis> spezzate una definizione di classe in - più file o in più blocchi PHP. Il seguente codice non funziona: + più file o in più blocchi PHP. Si può anche <emphasis>EVITARE</emphasis> di spezzare + la definizione di una classe in più blocchi PHP, a meno che la suddivisione non + sia all'interno della dichiarazione di un metodo. Il seguente codice non funziona: </simpara> <para> <informalexample> - <programlisting> + <programlisting role="php"> <![CDATA[ <?php class test { @@ -71,6 +73,26 @@ </programlisting> </informalexample> </para> + <simpara> + Tuttavia è permessa la seguente struttura: + </simpara> + <para> + <informalexample> + <programlisting role="php"> +<![CDATA[ +<?php +class test { + function test() { + ?> + <?php + print 'OK'; + } +} +?> +]]> + </programlisting> + </informalexample> + </para> </warning> <simpara> @@ -114,25 +136,23 @@ <programlisting role="php"> <![CDATA[ <?php +class Cart { /* questo non funziona in PHP 4. */ -class Cart -{ var $todays_date = date("Y-m-d"); var $name = $firstname; var $owner = 'Fred ' . 'Jones'; + /* E' permesso l'uso di matrici contenenti costanti */ var $items = array("VCR", "TV"); } /* Questo è corretto. */ -class Cart -{ +class Cart { var $todays_date; var $name; var $owner; var $items; - - function Cart() - { + var $items = array("VCR", "TV"); + function Cart() { $this->todays_date = date("Y-m-d"); $this->name = $GLOBALS['firstname']; /* etc ... */ @@ -176,7 +196,7 @@ remove_item() e della variabile $items, ma per ogni oggetto queste sono funzioni e variabili sono distinte. Potete pensare agli oggetti come a qualcosa di simile alle directories di un filesystem. In un - filesystem si possono avere due diversi files README.TXT, purchè + filesystem si possono avere due diversi files <filename>README.TXT</filename>, purchè siano in directories differenti. Così come in un filesystem dovete digitare il nome (percorso) completo per raggiungere un determinato file partendo da una directory toplevel, così dovete specificare il @@ -224,9 +244,65 @@ <note> <para> + La pseudo variabile <varname>$this</varname> di norma non è definita se + il metodo in cui è utilizzata è richiamato staticamente. Tuttavia questa + non è la regola: <varname>$this</varname> è definita se il metodo è chiamato staticamente + da un'altro oggetto. In questo caso il valore di + <varname>$this</varname> è l'oggetto chiamante. Tutto ciò viene + illustrato dal seguente esempio: + <informalexample> + <programlisting role="php"> +<![CDATA[ +<?php +class A +{ + function foo() + { + if (isset($this)) { + echo '$this is defined ('; + echo get_class($this); + echo ")\n"; + } else { + echo "\$this is not defined.\n"; + } + } +} + +class B +{ + function bar() + { + A::foo(); + } +} + +$a = new A(); +$a->foo(); +A::foo(); +$b = new B(); +$b->bar(); +B::bar(); +?> +]]> + </programlisting> + &example.outputs; + <screen> +<![CDATA[ +$this is defined (a) +$this is not defined. +$this is defined (b) +$this is not defined. +]]> + </screen> + </informalexample> + </para> + </note> + + <note> + <para> Ci sono molte utili funzioni per manipolare classi ed oggetti. Se desiderate conoscerle potete dare un'occhiata alle - <link linkend="ref.classobj">Class/Object Functions</link> + <link linkend="ref.classobj">Class/Object Functions</link>. </para> </note> </sect1> @@ -254,12 +330,10 @@ <programlisting role="php"> <![CDATA[ <?php -class Named_Cart extends Cart -{ +class Named_Cart extends Cart { var $owner; - function set_owner ($name) - { + function set_owner ($name) { $this->owner = $name; } } @@ -312,33 +386,21 @@ <sect1 id="language.oop.constructor"> <title><literal>Costruttori</literal></title> - - <caution> - <simpara> - In PHP 3 i costruttori si comportano diversamente rispetto a - PHP 4. La semantica di PHP 4 è decisamente da preferire. - </simpara> - </caution> - <para> I costruttori sono funzioni che esistono in una classe e che sono chiamate automaticamente quando si crea una nuova istanza - di una classe con <literal>new</literal>. In PHP 3, una funzione - si transforma in in un costruttore quando ha lo stesso nome di una classe. - In PHP 4, una funzione diventa un costruttore, quando ha lo stesso nome di - una classe ed è definita all'interno della classe stessa - la differenza è sottile, - ma cruciale (si veda sotto). + di una classe con <literal>new</literal>. In PHP 4, una funzione diventa un costruttore, + quando ha lo stesso nome della classe. Se una classe non ha + costruttore, allora si richiama il costruttore della + classe base, se esiste. </para> <informalexample> <programlisting role="php"> <![CDATA[ <?php -// Funziona in PHP 3 e PHP 4. -class Auto_Cart extends Cart -{ - function Auto_Cart() - { +class Auto_Cart extends Cart { + function Auto_Cart() { $this->add_item ("10", 1); } } @@ -361,21 +423,16 @@ <programlisting role="php"> <![CDATA[ <?php -// Funziona in PHP 3 and PHP 4. -class Constructor_Cart extends Cart -{ - function Constructor_Cart($item = "10", $num = 1) - { +class Constructor_Cart extends Cart { + function Constructor_Cart($item = "10", $num = 1) { $this->add_item ($item, $num); } } // Istanzia il vecchio e noioso carrello. - $default_cart = new Constructor_Cart; // Un carrello nuovo ... - $different_cart = new Constructor_Cart("20", 17); ?> ]]> @@ -387,15 +444,6 @@ <emphasis>inibire</emphasis> gli errori provocati dal costruttore, es: <literal>@new</literal>. </para> - - <caution> - <simpara> - In PHP 3, le classi e i costruttori derivati presentano un - certo numero di limitazioni. I seguenti esempi dovrebbero - essere letti con attenzione per capire queste limitazioni. - </simpara> - </caution> - <informalexample> <programlisting role="php"> <![CDATA[ @@ -404,50 +452,8 @@ { function A() { - echo "Sono il costtruttore di A.<br>\n"; + echo "Sono il costtruttore di A.<br />\n"; } -} - -class B extends A -{ - function C() - { - echo "Sono una normale funzione.<br>\n"; - } -} - -// nessun costruttore è chiamato in PHP 3. -$b = new B; -?> -]]> - </programlisting> - </informalexample> - - <para> - In PHP 3, nessun costruttore è stato chiamanto nel suddetto esempio. - La regola in PHP 3 è: 'un costruttore è una funzione che ha lo stesso - nome di una classe'. Il nome della classe è B e non c'è nessuna - funzione B() nella classe B. - </para> - - <para> - Questa regola è stata cambiata in PHP 4, la nuova regola dice: - 'Se una classe non ha un costruttore proprio, verrà chiamato - il costruttore della classe base, se esiste'. Il suddetto esempio - avrebbe stampato 'Sono il costruttore di A.' in PHP 4. - </para> - - <informalexample> - <programlisting role="php"> -<![CDATA[ -<?php -class A -{ - function A() - { - echo "Sono il costruttore di A.<br>\n"; - } - function B() { echo "Sono una normale funzione di nome B della classe A.<br>\n"; @@ -457,10 +463,7 @@ class B extends A { - function C() - { - echo "Sono una normale funzione.<br>\n"; - } + } // This will call B() as a constructor. @@ -471,48 +474,31 @@ </informalexample> <para> - In PHP 3, la funzione B() della classe A si transformerà + La funzione B() della classe A si transformerà improvvisamente in un costruttore per la classe B, anche se - questo non era previsto. La regola in PHP 3 è: 'un costruttore - è una funzione che ha lo stesso nome di una classe'. PHP 3 non + questo non era previsto. PHP 4 non si preoccupa se la funzione è stata definita nella classe B o se è stata ereditata. - </para> - - <para> - La regola è stata corretta in PHP 4 ed è diventata: 'un costruttore - è una funzione con lo stesso nome della classe in cui è definita'. - Così in PHP 4, la classe B non avendo una funzione costruttore avrebbe - richiamato il costruttore della sua classe base, e sarebbe stato stampato - 'io sono il costruttore di A.'. - </para> - + </para> <caution> <simpara> - Nè PHP 3 nè PHP 4 chiamano costruttori di una classe base + Il PHP 4 non richiama i costruttori di una classe base automaticamente da un costruttore di una classe derivata. È responsabilità del programmatore propagare la chiamata ai costruttori dove è necessario. </simpara> </caution> - <note> - <simpara> - Non ci sono distruttori in PHP 3 o in PHP 4. Potete usare - <function>register_shutdown_function</function> per simulare - la maggior parte degli effetti dei distruttori. - </simpara> - </note> - <para> I distruttori sono funzioni che sono chiamate automaticamente quando una variabile è distrutta con <function>unset</function> o semplicemente uscendo dal suo ambito. Non ci sono distruttori - in PHP. + in PHP. Si può utilizzare <function>register_shutdown_function</function> + per simulare gli effetti del distruttore. </para> </sect1> <sect1 id="keyword.paamayim-nekudotayim"><!-- :-) --> - <title><literal>::</literal></title> + <title>Operatore Scope Resolution (<literal>::</literal>)</title> <caution> <simpara> @@ -525,40 +511,35 @@ di classi base o riferirsi alle funzioni di classi senza istanziarle. L'operatore :: è usato per questi scopi. - </para> - + </para> <informalexample> <programlisting role="php"> <![CDATA[ <?php -class A -{ - function example() - { - echo "Sono la funzione originale A::example().<br>\n"; +class A { + function example() { + echo "Sono la funzione originale A::example().<br />\n"; } } -class B extends A -{ - function example() - { - echo "Sono la funzione ridefinita B::example().<br>\n"; +class B extends A { + function example() { + echo "Sono la funzione ridefinita B::example().<br />\n"; A::example(); } } // non viene istanziato nessun oggetto dalla classe A. // ma il codice stampa -// Sono la funzione originale A::example().<br> +// Sono la funzione originale A::example().<br /> A::example(); // crea un oggetto dalla classe B. $b = new B; // questo codice stampa -// Sono la funzione ridefinita B::example().<br> -// Sono la funzione originale A::example().<br> +// Sono la funzione ridefinita B::example().<br /> +// Sono la funzione originale A::example().<br /> $b->example(); ?> ]]> @@ -626,19 +607,15 @@ <programlisting role="php"> <![CDATA[ <?php -class A -{ - function example() - { - echo "Sono A::example() e fornisco una funzionalità di base.<br>\n"; +class A { + function example() { + echo "Sono A::example() e fornisco una funzionalità di base.<br />\n"; } } -class B extends A -{ - function example() - { - echo "Sono B::example() e fornisco una funzionalità aggiuntiva.<br>\n"; +class B extends A { + function example() { + echo "Sono B::example() e fornisco una funzionalità aggiuntiva.<br />\n"; parent::example(); } } @@ -701,12 +678,10 @@ <?php // classa.inc: - class A - { + class A { var $one = 1; - function show_one() - { + function show_one() { echo $this->one; } } @@ -718,7 +693,7 @@ $s = serialize($a); // memorizzare $s in qualche posto della page2. $fp = fopen("store", "w"); - fputs($fp, $s); + fwrite($fp, $s); fclose($fp); // page2.php: @@ -808,10 +783,8 @@ <programlisting role="php"> <![CDATA[ <?php -class Foo -{ - function Foo($name) - { +class Foo { + function Foo($name) { // crea un riferimento all'interno della variabile $globalref global $globalref; $globalref[] = &$this; @@ -821,13 +794,11 @@ $this->echoName(); } - function echoName() - { + function echoName() { echo "<br>",$this->name; } - function setName($name) - { + function setName($name) { $this->name = $name; } } @@ -929,37 +900,30 @@ <programlisting role="php"> <![CDATA[ <?php -class A -{ - function A($i) - { +class A { + function A($i) { $this->value = $i; // provare a capire perchè qui non abbiamo bisogno d'un riferimento $this->b = new B($this); } - function createRef() - { + function createRef() { $this->c = new B($this); } - function echoValue() - { - echo "<br>","class ",get_class($this),': ',$this->value; + function echoValue() { + echo "<br />","class ",get_class($this),': ',$this->value; } } -class B -{ - function B(&$a) - { +class B { + function B(&$a) { $this->a = &$a; } - function echoValue() - { - echo "<br>","class ",get_class($this),': ',$this->a->value; + function echoValue() { + echo "<br />","class ",get_class($this),': ',$this->a->value; } } @@ -977,25 +941,26 @@ $a->echoValue(); $a->b->echoValue(); // * $a->c->echoValue(); - -/* -output: +?> +]]> + </programlisting> + &example.outputs; + <screen> +<![CDATA[ class A: 10 class B: 10 class B: 10 class A: 11 class B: 11 class B: 11 -*/ -?> ]]> - </programlisting> + </screen> </informalexample> </para> </sect1> - <sect1 id="language.oop.object-comparison-php4"> - <title>Confronto di oggetti in PHP 4</title> + <sect1 id="language.oop.object-comparison"> + <title>Confronto di oggetti</title> <para> In PHP 4, gli oggetti sono confrontati semplicemente, cioè: due istanze di oggetto sono uguali se hanno gli stessi attributi e valori, e sono @@ -1060,9 +1025,9 @@ ?> ]]> </programlisting> - </example> - Si ha: + &example.outputs; <screen> +<![CDATA[ Confronto di istanze create con gli stessi parametri o1 == o2 : TRUE o1 != o2 : FALSE @@ -1080,7 +1045,9 @@ o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE - </screen> +]]> + </screen> + </example> Questo è l'output che si ottiene secondo le regole di confronto descritte sopra. Solo le istanze con gli stessi valori per gli attributi e derivanti dalla stessa classe sono considerate uguali ed identiche. @@ -1127,9 +1094,9 @@ ?> ]]> </programlisting> - </example> - L'output previsto è: - <screen> + &example.outputs; + <screen> +<![CDATA[ Oggetti composti u(o,p) e v(q,p) o1 == o2 : TRUE o1 != o2 : FALSE @@ -1141,110 +1108,11 @@ o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE - </screen> +]]> + </screen> + </example> </para> </sect1> - - <sect1 id="language.oop.object-comparison-php5"> - <title>Confronto di oggetti in PHP 5</title> - &warn.experimental; - <para> - In PHP 5, il confronto tra oggetti è più complicato che in PHP 4, ed è in armonia - con quello che ci si può aspettare da un linguaggio orientato agli oggetti - (non che PHP 5 lo sia veramente). - </para> - <para> - Quando si usa l'operatore di confronto (<literal>==</literal>), - le variabili oggetto sono confrontate in modo semplice, cioè: due istanze - di oggetto sono uguali se hanno gli stessi attributi e valori, e sono - istanze della stessa classe, definita nello stesso spazio dei nomi. - </para> - <para> - Diversamente, quando usiamo l'operatore di identità (<literal>===</literal>), - le variabili oggetto sono identiche se e solo se si riferiscono alla stessa - istanza della stessa classe (in un particolare spazio dei nomi). - </para> - <para> - Un esempio chiarirà questa regola. - <example> - <title>Esempio di confronto di oggetti in PHP 5</title> - <programlisting role='php'> -<![CDATA[ -<?php -function bool2str($bool) { - if ($bool === false) { - return 'FALSE'; - } else { - return 'TRUE'; - } -} - -function compareObjects(&$o1, &$o2) { - echo 'o1 == o2 : '.bool2str($o1 == $o2)."\n"; - echo 'o1 != o2 : '.bool2str($o1 != $o2)."\n"; - echo 'o1 === o2 : '.bool2str($o1 === $o2)."\n"; - echo 'o1 !== o2 : '.bool2str($o1 !== $o2)."\n"; -} - -class Flag { - var $flag; - - function Flag($flag=true) { - $this->flag = $flag; - } -} - -namespace Other { - - class Flag { - var $flag; - - function Flag($flag=true) { - $this->flag = $flag; - } - } - -} - -$o = new Flag(); -$p = new Flag(); -$q = $o; -$r = new Other::Flag(); - -echo "Due istanze della stessa classe\n"; -compareObjects($o, $p); - -echo "\nDue riferimenti alla stessa istanza\n"; -compareObjects($o, $q); - -echo "\nIstanze di classi di diversi spazi dei nomi e simili nomi di classe\n"; -compareObjects($o, $r); -?> -]]> - </programlisting> - </example> - L'esempio stampa: - <screen> -Due istanze della stessa classe -o1 == o2 : TRUE -o1 != o2 : FALSE -o1 === o2 : FALSE -o1 !== o2 : TRUE - -Due riferimenti alla stessa istanza -o1 == o2 : TRUE -o1 != o2 : FALSE -o1 === o2 : TRUE -o1 !== o2 : FALSE - -Istanze di classi di diversi spazi dei nomi e simili nomi di classe -o1 == o2 : FALSE -o1 != o2 : TRUE -o1 === o2 : FALSE -o1 !== o2 : TRUE - </screen> - </para> - </sect1> </chapter> <!-- Keep this comment at the end of the file
« previous php.doc.it (#725) next »