cvs: phpdoc-it /language control-structures.xml operators.xml references.xml

From: Date: Tue, 31 May 2005 12:29:51 +0000
Subject: cvs: phpdoc-it /language control-structures.xml operators.xml references.xml
Groups: php.doc.it 
Request: Send a blank email to doc-it+get-724@lists.php.net to get a copy of this message
darvina Tue May 31 08:29:51 2005 EDT Modified files: /phpdoc-it/language control-structures.xml operators.xml references.xml Log: Sync to En tree

http://cvs.php.net/diff.php/phpdoc-it/language/control-structures.xml?r1=1.12&r2=1.13&ty=u Index: phpdoc-it/language/control-structures.xml diff -u phpdoc-it/language/control-structures.xml:1.12 phpdoc-it/language/control-structures.xml:1.13 --- phpdoc-it/language/control-structures.xml:1.12 Wed May 29 06:45:58 2002 +++ phpdoc-it/language/control-structures.xml Tue May 31 08:29:50 2005 @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="iso-8859-1"?> -<!-- EN-Revision: 1.58 Maintainer: spisto Status: ready --> - <chapter id="control-structures"> +<!-- EN-Revision: 1.117 Maintainer: spisto Status: ready --> + <chapter id="language.control-structures"> <title>Strutture di controllo</title> <simpara> @@ -24,8 +24,10 @@ <informalexample> <programlisting> <![CDATA[ -if (espressione) +<?php +if (expression) istruzione +?> ]]> </programlisting> </informalexample> @@ -34,7 +36,7 @@ Come descritto nella <link linkend="language.expressions">sezione sulle espressioni</link>, <replaceable>espressione</replaceable> restiruirà il suo valore booleano. Se <replaceable>espressione</replaceable> vale &true;, - PHP eseguirà <replaceable>istruzione</replaceable>, e se essa vale + PHP eseguirà <replaceable>istruzione</replaceable>, e se essa vale &false; - la ignorerà. Più informazioni riguardo i valori valutati &false; possono essere trovati nella sezione <link linkend="language.types.boolean.casting">'Conversione in booleano'</link> @@ -42,13 +44,15 @@ </simpara> <para> L'esempio che segue visualizzerà <computeroutput>a è maggiore - di b</computeroutput> se <replaceable>$a</replaceable> sarà maggiore - di <replaceable>$b</replaceable>: + di b</computeroutput> se <varname>$a</varname> sarà maggiore + di <varname>$b</varname>: <informalexample> <programlisting role="php"> <![CDATA[ +<?php if ($a > $b) - print "a è maggiore di b"; + echo "a è maggiore di b"; +?> ]]> </programlisting> </informalexample> @@ -59,16 +63,18 @@ <literal>if</literal> per ciascuna istruzione. Si possono raggruppare diverse istruzioni in un singolo gruppo di istruzioni. Per esempio, il codice che segue visualizzerà <computeroutput>a è maggiore di b</computeroutput> - se <replaceable>$a</replaceable> è maggiore di <replaceable>$b</replaceable>, - e successivamente assegnerà il valore della variabile <replaceable>$a</replaceable> - alla variabile <replaceable>$b</replaceable>: + se <varname>$a</varname> è maggiore di <varname>$b</varname>, + e successivamente assegnerà il valore della variabile <varname>$a</varname> + alla variabile <varname>$b</varname>: <informalexample> <programlisting role="php"> <![CDATA[ +<?php if ($a > $b) { - print "a è maggiore di b"; + echo "a è maggiore di b"; $b = $a; } +?> ]]> </programlisting> </informalexample> @@ -91,17 +97,19 @@ di eseguire un'istruzione se l'espressione nel ramo <literal>if</literal> è &false;. L'esempio che segue visualizzerà <computeroutput>a è maggiore - di b</computeroutput> se <replaceable>$a</replaceable> è maggiore di - <replaceable>$b</replaceable> e <computeroutput>a NON è maggiore + di b</computeroutput> se <varname>$a</varname> è maggiore di + <varname>$b</varname> e <computeroutput>a NON è maggiore di b</computeroutput> altrimenti: <informalexample> <programlisting role="php"> <![CDATA[ +<?php if ($a > $b) { - print "a è maggiore di b"; + echo "a è maggiore di b"; } else { - print "a NON è maggiore di b"; + echo "a NON è maggiore di b"; } +?> ]]> </programlisting> </informalexample> @@ -134,13 +142,15 @@ <informalexample> <programlisting role="php"> <![CDATA[ +<?php if ($a > $b) { - print "a è maggiore di b"; + echo "a è maggiore di b"; } elseif ($a == $b) { - print "a è uguale a b"; + echo "a è uguale a b"; } else { - print "a è minore di b"; + echo "a è minore di b"; } +?> ]]> </programlisting> </informalexample> @@ -191,7 +201,7 @@ <simpara> Nell'esempio precedente, il blocco HTML "a è uguale a 5" è incluso nel ramo <literal>if</literal> scritto utilizzando la sintassi alternativa. - Il blocco HTML verrà visualizzato solamente se $a è uguale a 5. + Il blocco HTML verrà visualizzato solamente se <varname>$a</varname> è uguale a 5. </simpara> <para> La sintassi alternativa si applica anche ad <literal>else</literal> ed @@ -201,15 +211,17 @@ <informalexample> <programlisting role="php"> <![CDATA[ +<?php if ($a == 5): - print "a è uguale a 5"; - print "..."; + echo "a è uguale a 5"; + echo "..."; elseif ($a == 6): - print "a è uguale a 6"; - print "!!!"; + echo "a è uguale a 6"; + echo "!!!"; else: - print "a non è nè 5 nè 6"; + echo "a non è nè 5 nè 6"; endif; +?> ]]> </programlisting> </informalexample> @@ -230,7 +242,8 @@ <informalexample> <programlisting> <![CDATA[ -while (espressione) istruzione +while (espressione) + istruzione ]]> </programlisting> </informalexample> @@ -256,7 +269,10 @@ <informalexample> <programlisting> <![CDATA[ -while (espressione): istruzione ... endwhile; +while (espressione): + istruzione + ... +endwhile; ]]> </programlisting> </informalexample> @@ -267,11 +283,12 @@ <informalexample> <programlisting> <![CDATA[ +<?php /* esempio 1 */ $i = 1; while ($i <= 10) { - print $i++; /* Il valore visualizzato è il valore della + echo $i++; /* Il valore visualizzato è il valore della variabile $i prima dell'incremento (post-incremento) */ } @@ -280,9 +297,10 @@ $i = 1; while ($i <= 10): - print $i; + echo $i; $i++; endwhile; +?> ]]> </programlisting> </informalexample> @@ -290,13 +308,13 @@ </sect1> <sect1 id="control-structures.do.while"> - <title><literal>do..while</literal></title> + <title><literal>do-while</literal></title> <simpara> - Il ciclo <literal>do..while</literal> è simile al ciclo + Il ciclo <literal>do-while</literal> è simile al ciclo <literal>while</literal>, con l'unica differenza che il valore dell'espressione viene controllato alla fine di ogni iterazione anzichè all'inizio. La differenza più importante rispetto a <literal>while</literal> è che - la prima iterazione di un blocco <literal>do..while</literal> verrà + la prima iterazione di un blocco <literal>do-while</literal> verrà sempre eseguita (il valore dell'espressione viene controllato alla fine del ciclo), mentre non sarà necessariamente eseguito in un ciclo <literal>while</literal> (il valore dell'espressione viene @@ -305,15 +323,17 @@ termina immediatamente). </simpara> <para> - È ammessa una sola sintassi per il ciclo <literal>do..while</literal>: + È ammessa una sola sintassi per il ciclo <literal>do-while</literal>: <informalexample> <programlisting role="php"> <![CDATA[ +<?php $i = 0; do { - print $i; -} while ($i>0); + echo $i; +} while ($i > 0); +?> ]]> </programlisting> </informalexample> @@ -326,28 +346,28 @@ </simpara> <para> Chi ha utilizzato il linguaggio C conosce probabilmente un'altro modo di utilizzare - il ciclo <literal>do..while</literal>, che permette di terminare l'esecuzione + il ciclo <literal>do-while</literal>, che permette di terminare l'esecuzione delle istruzioni durante l'esecuzione stessa, utilizzando - <literal>do..while</literal>(0), e usando l'istruzione <link + <literal>do-while</literal>(0), e usando l'istruzione <link linkend="control-structures.break"><literal>break</literal></link>. Il codice che segue esemplifica questa possibilità: <informalexample> <programlisting role="php"> <![CDATA[ +<?php do { if ($i < 5) { - print "i non è abbastanza grande"; + echo "i non è abbastanza grande"; break; } $i *= $factor; if ($i < $minimum_limit) { break; } - print "i è ok"; - - ...processa i... - -} while(0); + echo "i è ok"; + /* processa i */ +} while (0); +?> ]]> </programlisting> </informalexample> @@ -368,30 +388,31 @@ <informalexample> <programlisting> <![CDATA[ -for (espressione1; espressione2; espressione3) istruzione +for (espressione1; espressione2; espressione3) + istruzione ]]> </programlisting> </informalexample> </para> <simpara> - Il valore della prima espressione (<replaceable>espressione1</replaceable>) viene + Il valore della prima espressione (<varname>espressione1</varname>) viene verificato (eseguito) una sola volta incondizionatamente all'inizio del ciclo. </simpara> <simpara> Ad ogni iterazione, - si controlla il valore di <replaceable>espressione2</replaceable>. Se è + si controlla il valore di <varname>espressione2</varname>. Se è &true;, il ciclo prosegue e viene eseguita l'istruzione (o le istruzioni) contenuta nel blocco; se è &false;, l'esecuzione del ciclo termina. </simpara> <simpara> Al termine di ogni iterazione, si verifica (si esegue) - il valore di <replaceable>espressione3</replaceable>. + il valore di <varname>espressione3</varname>. </simpara> <simpara> Le due espressioni possono anche non essere presenti. - Se non esiste <replaceable>espressione2</replaceable> significa che il ciclo deve + Se non esiste <varname>espressione2</varname> significa che il ciclo deve essere eseguito indefinitamente (PHP considera implicitamente che il suo valore è &true;, come in C). Questa possibilità in fondo non è utile come può sembrare perchè obbliga a terminare il ciclo utilizzando @@ -406,35 +427,35 @@ <informalexample> <programlisting role="php"> <![CDATA[ +<?php /* esempio 1 */ for ($i = 1; $i <= 10; $i++) { - print $i; + echo $i; } /* esempio 2 */ -for ($i = 1;;$i++) { +for ($i= 1; ; $i++) { if ($i > 10) { break; } - print $i; + echo $i; } /* esempio 3 */ - $i = 1; -for (;;) { +for (; ; ) { if ($i > 10) { break; } - print $i; + echo $i; $i++; } /* esempio 4 */ - for ($i = 1; $i <= 10; print $i, $i++) ; +?> ]]> </programlisting> </informalexample> @@ -451,22 +472,14 @@ <informalexample> <programlisting> <![CDATA[ -for (espressione1; espressione2; espressione3): istruzione; ...; endfor; +for (espressione1; espressione2; espressione3): + istruzione + ... +endfor; ]]> </programlisting> </informalexample> - </para> - <para> - Alcuni linguaggi permettono l'uso della struttura di controllo <literal>foreach</literal> per - attraversare un array o una tabella hash. PHP 3 non premette l'uso di tale ciclo mentre PHP 4 si - (vedere <link - linkend="control-structures.foreach">foreach</link>). In PHP 3 è - possibile combinare <link linkend="control-structures.while">while</link> - con la funzione <function>list</function> e <function>each</function> - per ottenere la stessa funzionalià. Si veda la documentazione di queste funzioni - per ulteriori esempi. - </para> - + </para> </sect1> <sect1 id="control-structures.foreach"> @@ -474,13 +487,17 @@ <para> PHP 4 (non PHP 3) permette l'uso della struttura di controllo <literal>foreach</literal>, alla stessa maniera del linguaggio Perl e altri. Ciò semplicemente fornisce - una facile metodo per attraversare un array. Esistono due possibili notazioni sintattiche; la seconda è + una facile metodo per attraversare un array. <literal>foreach</literal> funziona solo con le matrici + e genera un errore se si tenta di utilizzarlo con variabili di tipo diffente + oppure non inizializzate. Esistono due possibili notazioni sintattiche; la seconda è un'utile estensione della prima: <informalexample> <programlisting> <![CDATA[ -foreach(array_expression as $value) istruzione -foreach(array_expression as $key => $value) istruzione +foreach(array_expression as $value) + istruzione +foreach(array_expression as $key => $value) i + struzione ]]> </programlisting> </informalexample> @@ -497,6 +514,10 @@ valore dell'indice corrente viene assegnato ad ogni ciclo, alla variabile <literal>$key</literal>. </simpara> + <simpara> + Dal PHP sono anche possibili + <link linkend="language.oop5.iterations">cicli sugli oggetti</link>. + </simpara> <para> <note> <para> @@ -511,34 +532,65 @@ <para> <note> <para> - È importante notare che <literal>foreach</literal> opera su una copia - dell'array, non sull'array stesso, pertanto il puntatore dell'array originale + A meno che la matrice non sia <link linkend="language.references">per riferimento</link>, + <literal>foreach</literal> agisce su una copia e non + sulla matrice stessa. Pertanto il puntatore dell'array originale non viene modificato come accade utilizzando la funzione <function>each</function> e le modifiche agli elementi dell'array non appaiono nell'array originale. + Tuttavia il puntatore interno della matrice originale + <emphasis>viene</emphasis> avanzato durante l'elaborazione della + matrice. Se si assume che il ciclo foreach giunga al termine, allorasi avrà che + il puntatore interno della matrcie sarà al termine della matrice stessa. + </para> + <para> + Dal PHP 5 si può modificare facilmente gli elementi di una matrice anteponendo + &amp; a <literal>$value</literal> with &amp;. Questo assegna un + <link linkend="language.references">riferimento</link> anzichè copiare + il valore. + <informalexample> + <programlisting role="php"> +<![CDATA[ +<?php +$arr = array(1, 2, 3, 4); +foreach ($arr as &$value) { + $value = $value * 2; +} +// $arr vale ora array(2, 4, 6, 8) +?> +]]> + </programlisting> + </informalexample> + Questo è possibile soltanto se l'array indicato può essere referenziato + (ad esempio è una variabile). </para> </note> </para> - <note> - <para> - <literal>foreach</literal> non offre la possibilità di annullare la generazione + <para> + <note> + <para> + <literal>foreach</literal> non offre la possibilità di annullare la generazione di messaggi d'errore utilizzando il carattere '@'. - </para> - </note> + </para> + </note> + </para> <para> Avete probabilmente notato che i due cicli seguenti sono identici da un punto di vista funzionale: <informalexample> <programlisting role="php"> <![CDATA[ +<?php +$arr = array("one", "two", "three"); reset ($arr); while (list(, $value) = each ($arr)) { - echo "Valore: $value<br>\n"; + echo "Valore: $value<br />\n"; } foreach ($arr as $value) { - echo "Valore: $value<br>\n"; + echo "Valore: $value<br />\n"; } +?> ]]> </programlisting> </informalexample> @@ -546,14 +598,17 @@ <informalexample> <programlisting role="php"> <![CDATA[ +<?php +$arr = array("one", "two", "three"); reset ($arr); while (list($key, $value) = each ($arr)) { - echo "Chiave: $key; Valore: $value<br>\n"; + echo "Chiave: $key; Valore: $value<br />\n"; } foreach ($arr as $key => $value) { echo "Chiave: $key; Valore: $value<br>\n"; } +?> ]]> </programlisting> </informalexample> @@ -563,56 +618,57 @@ <informalexample> <programlisting role="php"> <![CDATA[ +<?php /* esempio 1 foreach: solo il valore */ - -$a = array (1, 2, 3, 17); +$a = array(1, 2, 3, 17); foreach ($a as $v) { - print "Valore corrente di \$a: $v.\n"; + echo "Valore corrente di \$a: $v.\n"; } /* esempio 2 foreach: valore (con la chiave stampata) */ -$a = array (1, 2, 3, 17); +$a = array(1, 2, 3, 17); $i = 0; /* solo per un proposito illustrativo */ -foreach($a as $v) { - print "\$a[$i] => $v.\n"; +foreach ($a as $v) { + echo "\$a[$i] => $v.\n"; $i++; } /* esempio 3 foreach: chiave e valore */ -$a = array ( +$a = array( "uno" => 1, "due" => 2, "tre" => 3, "diciassette" => 17 ); -foreach($a as $k => $v) { - print "\$a[$k] => $v.\n"; +foreach ($a as $k => $v) { + echo "\$a[$k] => $v.\n"; } /* esempio 4 foreach: array multidimensionali */ - +$a = array(); $a[0][0] = "a"; $a[0][1] = "b"; $a[1][0] = "y"; $a[1][1] = "z"; -foreach($a as $v1) { +foreach ($a as $v1) { foreach ($v1 as $v2) { - print "$v2\n"; + echo "$v2\n"; } } /* esempio 5 foreach: array dinamici */ -foreach(array(1, 2, 3, 4, 5) as $v) { - print "$v\n"; +foreach (array(1, 2, 3, 4, 5) as $v) { + echo "$v\n"; } +?> ]]> </programlisting> </informalexample> @@ -623,8 +679,8 @@ <title><literal>break</literal></title> <simpara> <literal>break</literal> termina l'esecuzione di una struttura - <literal>for</literal>, <literal>foreach</literal> - <literal>while</literal>, <literal>do..while</literal> o + <literal>for</literal>, <literal>foreach</literal>, + <literal>while</literal>, <literal>do-while</literal> o <literal>switch</literal>. </simpara> <simpara> @@ -636,12 +692,13 @@ <informalexample> <programlisting role="php"> <![CDATA[ +<?php $arr = array ('uno', 'due', 'tre', 'quattro', 'stop', 'cinque'); while (list (, $val) = each ($arr)) { if ($val == 'stop') { break; /* Qui si può anche usare 'break 1;'. */ } - echo "$val<br>\n"; + echo "$val<br />\n"; } /* Uso dell'argomento opzionale. */ @@ -650,15 +707,16 @@ while (++$i) { switch ($i) { case 5: - echo "At 5<br>\n"; + echo "At 5<br />\n"; break 1; /* Interrompe solo awitch. */ case 10: - echo "At 10; quitting<br>\n"; + echo "At 10; quitting<br />\n"; break 2; /* Interrompe switch e while. */ default: break; } } +?> ]]> </programlisting> </informalexample> @@ -672,6 +730,14 @@ del ciclo corrente e continuare con l'esecuzione all'inizio del ciclo successivo. </simpara> + <note> + <simpara> + Si noti che in PHP l'istruzione + <link linkend="control-structures.switch">switch</link> è considerata un'elemento + di loop per gli scopi di + <literal>continue</literal>. + </simpara> + </note> <simpara> <literal>continue</literal> accetta un argomento numerico opzionale che definisce, nel caso di cicli annidati, il numero di cicli da interrompere @@ -681,30 +747,75 @@ <informalexample> <programlisting role="php"> <![CDATA[ -while (list ($key, $value) = each ($arr)) { +<?php +while (list($key, $value) = each ($arr)) { if (!($key % 2)) { // salta odd members continue; } - do_something_odd ($value); + do_something_odd($value); } $i = 0; while ($i++ < 5) { - echo "Esterno<br>\n"; + echo "Esterno<br />\n"; while (1) { - echo "&nbsp;&nbsp;Centrale<br>\n"; + echo "&nbsp;&nbsp;Centrale<br />\n"; while (1) { - echo "&nbsp;&nbsp;Interno<br>\n"; + echo "&nbsp;&nbsp;Interno<br />\n"; continue 3; } - echo "Questo non sarà mai stampato.<br>\n"; + echo "Questo non sarà mai stampato.<br />\n"; } - echo "Nemmeno questo.<br>\n"; + echo "Nemmeno questo.<br />\n"; } +?> ]]> </programlisting> </informalexample> </para> + <para> + L'omissione del punto e virgola dopo <literal>continue</literal> può creare + confuzione. Nel sseguente esempio si illustra cosa non di deve fare. + </para> + <para> + <informalexample> + <programlisting role="php"> +<![CDATA[ +<?php + for ($i = 0; $i < 5; ++$i) { + if ($i == 2) + continue + print "$i\n"; + } +?> +]]> + </programlisting> + <para> + Ci si può aspettare come risultato: + </para> + <screen> +<![CDATA[ + +1 +3 +4 +]]> + </screen> + <para> + invece si avrà: + </para> + <screen> +<![CDATA[ +2 +]]> + </screen> + <para> + poichè il valore restituida da <function>print</function> + è <literal>int(1)</literal> e sembrerà il numero + opzionale indicato in precedenza. + </para> + </informalexample> + </para> </sect1> <sect1 id="control-structures.switch"> @@ -717,38 +828,68 @@ del valore di detta variabile. Questo è esattamente quello che fa la struttura di controllo <literal>switch</literal>. </simpara> + <note> + <simpara> + Si noti che a differenza di altri linguaggi, l'istruzione + <link linkend="control-structures.continue">continue</link> + si può utilizzare anche con switch ed ha un comportamento simile a <literal>break</literal>. + Se si ha uno switch all'interno di un ciclo e si desidera continuare con il prossimo ciclo + del loop esterno, utilizzare <literal>continue 2</literal>. + </simpara> + </note> <para> Gli esempi seguenti mostrano due maniere differenti di scrivere - la stessa cosa, uno utilizzando una serie di <literal>if</literal>, - l'altro utilizzando <literal>switch</literal> - : - <informalexample> + la stessa cosa, uno utilizzando una serie di istruzioni <literal>if</literal> ed + <literal>elseif</literal> l'altro utilizzando + <literal>switch</literal>: + <example> + <title>Struttura <literal>switch</literal></title> <programlisting role="php"> <![CDATA[ +<?php if ($i == 0) { - print "i è uguale a 0"; -} -if ($i == 1) { - print "i è uguale a 1"; -} -if ($i == 2) { - print "i è uguale a 2"; + echo "i è uguale a 0"; +} elseif ($i == 1) { + echo "i è uguale a 1"; +} elseif ($i == 2) { + echo "i è uguale a 2"; } switch ($i) { case 0: - print "i è uguale a 0"; + echo "i è uguale a 0"; break; case 1: - print "i è uguale a 1"; + echo "i è uguale a 1"; break; case 2: - print "i è uguale a 2"; + echo "i è uguale a 2"; break; } +?> ]]> </programlisting> - </informalexample> + </example> + <example> + <title>L'istruzione <literal>switch</literal> permette l'uso di stringhe</title> + <programlisting role="php"> +<![CDATA[ +<?php +switch ($i) { +case "apple": + echo "i is apple"; + break; +case "bar": + echo "i is bar"; + break; +case "cake": + echo "i is cake"; + break; +} +?> +]]> + </programlisting> + </example> </para> <para> È importante comprendere esattamente come viene eseguita la @@ -767,24 +908,25 @@ <informalexample> <programlisting role="php"> <![CDATA[ +<?php switch ($i) { case 0: - print "i è uguale a 0"; + echo "i è uguale a 0"; case 1: - print "i è uguale a 1"; + echo "i è uguale a 1"; case 2: - print "i è uguale a 2"; + echo "i è uguale a 2"; } +?> ]]> </programlisting> </informalexample> </para> <simpara> - In questo caso se $i è uguale a 0, PHP eseguirà tutte le - istruzioni contenute nei blocchi case. Se $i è uguale a 1, - PHP eseguirà le istruzioni degli ultimi due blocchi case e - solamente se $i è uguale a 2 otterremo il risultato voluto - e si visualizzerà solo '$i è uguale a 2'. Pertanto + In questo caso se <varname>$i</varname> è uguale a 0, PHP eseguirà tutte le + istruzioni echo!. Se <varname>$i</varname> è uguale a 1, PHP eseguirà le ultime due + echo. Si sarebbe ottenuto il comportamento atteso ( visualizzazione + di 'i uguale a 2') solamente se <varname>$i</varname> è uguale a 2. Pertanto è importante non dimenticare l'istruzione <literal>break</literal> (anche se in alcuni casi potrà essere necessario non utilizzarla). </simpara> @@ -802,39 +944,43 @@ <informalexample> <programlisting role="php"> <![CDATA[ +<?php switch ($i) { - case 0: - case 1: - case 2: - print "i è minore di 3 ma non negativo"; - break; - case 3: - print "i è 3"; +case 0: +case 1: +case 2: + print "i è minore di 3 ma non negativo"; + break; +case 3: + print "i è 3"; } +?> ]]> </programlisting> </informalexample> </para> <para> - Un blocco case speciale è il il blocco case di default. + Un blocco case speciale è il il blocco case di <literal>default</literal>. Uguaglia tutte le condizioni non uguagliate nei blocchi case precedenti e dev'essere l'ultimo blocco <literal>case</literal>. Per esempio: <informalexample> <programlisting role="php"> <![CDATA[ +<?php switch ($i) { - case 0: - print "i è uguale a 0"; - break; - case 1: - print "i è uguale a 1"; - break; - case 2: - print "i è uguale a 2"; - break; - default: - print "i è diverso da 0, 1 o 2"; +case 0: + echo "i è uguale a 0"; + break; +case 1: + echo "i è uguale a 1"; + break; +case 2: + echo "i è uguale a 2"; + break; +default: + echo "i è diverso da 0, 1 o 2"; } +?> ]]> </programlisting> </informalexample> @@ -853,19 +999,21 @@ <informalexample> <programlisting role="php"> <![CDATA[ +<?php switch ($i): - case 0: - print "i è uguale a 0"; - break; - case 1: - print "i è uguale a 1"; - break; - case 2: - print "i è uguale a 2"; - break; - default: - print "i è diverso da 0, 1 o 2"; +case 0: + echo "i è uguale a 0"; + break; +case 1: + echo "i è uguale a 1"; + break; +case 2: + echo "i è uguale a 2"; + break; +default: + echo "i è diverso da 0, 1 o 2"; endswitch; +?> ]]> </programlisting> </informalexample> @@ -882,7 +1030,8 @@ <informalexample> <programlisting> <![CDATA[ -declare (direttiva) istruzione +declare (direttiva) + istruzione ]]> </programlisting> </informalexample> @@ -899,18 +1048,40 @@ </para> <para> Verrà eseguita la parte <literal>istruzione</literal> del - blocco <literal>declare</literal> - come + blocco <literal>declare</literal> -- come verrà eseguita e quali effetti collaterali emergeranno durante l'esecuzione potrà dipendere dalla direttiva impostata nel blocco <literal>direttiva</literal>. </para> + <para> + L'istruzione <literal>declare</literal> può essere usata anche con visubilità globale, + influenzando tutto il codice che la segue. + <informalexample> + <programlisting role="php"> +<![CDATA[ +<?php +// queste righe hanno il medesimo effetto: + +// si può utitlizzare in questo modo: +declare(ticks=1) { + // inserire tutto il codice +} + +// o in questo modo +declare(ticks=1); +// inserire tutto il codice +?> +]]> + </programlisting> + </informalexample> + </para> <sect2 id="control-structures.declare.ticks"> <title>Ticks</title> <para>Un tick è un evento che si verifica per ogni - <replaceable>N</replaceable> istruzioni di basso livello eseguite + <varname>N</varname> istruzioni di basso livello eseguite dal parser all'interno del blocco <literal>declare</literal>. - Il valore per <replaceable>N</replaceable> viene specificato - usando <literal>ticks=<replaceable>N</replaceable></literal> + Il valore per <varname>N</varname> viene specificato + usando <literal>ticks=<varname>N</varname></literal> all'interno della sezione <literal>direttiva</literal> del blocco <literal>declare</literal>. </para> @@ -927,35 +1098,35 @@ <![CDATA[ <?php // Una funzione che registra il tempo quando viene chiamata -function profile ($dump = FALSE) +function profile($dump = FALSE) { static $profile; // Restituisce il tempo immagazinato in $profile, successivamente lo cancella if ($dump) { $temp = $profile; - unset ($profile); - return ($temp); + unset($profile); + return($temp); } - $profile[] = microtime (); + $profile[] = microtime(); } // Imposta un tick handler register_tick_function("profile"); // Inizializza la funzione prima del blocco declare -profile (); +profile(); // Esegue un blocco di codice, attraverso un tick ogni seconda istruzione -declare (ticks = 2) { +declare(ticks = 2) { for ($x = 1; $x < 50; ++$x) { - echo similar_text (md5($x), md5($x*$x)), "<br />"; + echo similar_text(md5($x), md5($x*$x)), "<br />;"; } } // Mostra i dati immagazionati nel profilo -print_r (profile (TRUE)); +print_r(profile(TRUE)); ?> ]]> </programlisting> @@ -1001,22 +1172,22 @@ è stato nominato da <link linkend="ini.auto-prepend-file">auto_prepend_file</link> o <link linkend="ini.auto-append-file">auto_append_file</link> - con le opzioni di configurazione nel <link linkend="configuration.file"> - file di configurazione</link>, allora l'esecuzione di quello script + con le opzioni di configurazione nel&php.ini;, allora l'esecuzione di quello script termina. </simpara> <simpara>Per maggiori informazioni, consultare <link linkend="functions.returning-values">Valori restituiti</link>. </simpara> - <note> - <simpara> - Notate che poichè <function>return</function> è un costrutto di linguaggio - e non una funzione, le parentesi che circondano i suoi - argomenti <emphasis>non</emphasis> sono richieste --infatti, è - più comune evitarle che usarle, nonostante ciò - non c'è motivo di preferire un modo o l'altro. - </simpara> - </note> + <para> + <note> + <simpara> + Notate che poichè <function>return</function> è un costrutto di linguaggio + e non una funzione, le parentesi che circondano i suoi + argomenti sono <emphasis>soltanto</emphasis> richieste se l'argomento + contiene un'espressione. E' comune non utilizzarle quando si ritorna una variabile. + </simpara> + </note> + </para> </sect1> @@ -1065,18 +1236,26 @@ <simpara> Vedere la documentazione di <function>include</function> per più esempi. </simpara> - <note> - <simpara> - Prima di PHP 4.0.2, si applica la seguente logica: <function>require</function> - tenterà sempre di leggere il file chiamato, anche se la riga su cui si trova non verrà mai eseguita. - L'istruzione condizionale non avrà effetto su <function>require</function>. Comunque, - se la riga su cui si verifica <function>require</function> non viene eseguita, - non sarà eseguito nemmeno il codice del file incluso. Similmente, le strutture - cicliche non avranno effetto sul comportamento di <function>require</function>. Sebbene - il codice contenuto nel file incluso è ancora soggetto a ciclo, - <function>require</function> stesso si verifica solo una volta. - </simpara> - </note> + <para> + <note> + <simpara> + Prima di PHP 4.0.2, si applica la seguente logica: <function>require</function> + tenterà sempre di leggere il file chiamato, anche se la riga su cui si trova non verrà mai eseguita. + L'istruzione condizionale non avrà effetto su <function>require</function>. Comunque, + se la riga su cui si verifica <function>require</function> non viene eseguita, + non sarà eseguito nemmeno il codice del file incluso. Similmente, le strutture + cicliche non avranno effetto sul + comportamento di <function>require</function>. Sebbene + il codice contenuto nel file incluso è ancora soggetto a ciclo, + <function>require</function> stesso si verifica solo una volta. + </simpara> + </note> + </para> + + &note.language-construct; + + &warn.no-win32-fopen-wrapper; + <simpara> Vedere anche <function>include</function>, <function>require_once</function>, <function>include_once</function>, <function>eval</function>, @@ -1101,6 +1280,18 @@ un file mancante fermi l'esecuzione della pagina. <function>include</function> non si comporta in questo modo, lo script continuerà nonostante tutto. Assicuratevi di avere un appropriato <link linkend="ini.include-path">include_path</link> impostato a dovere. + Attenzione che nelle versioni di PHP antecedenti la release 4.3.5 errori di parsing nei + file inclusi non bloccavano l'esecuzione. Da questa versione lo fanno. + </simpara> + <simpara> + I file da includere sono prima cercati nella include_path relativa rispetto alla directory di lavoro + e quindi nella include_path relativa alla directory dello script. Ad esempio, se la include_path + è impostata a <literal>.</literal>, e la directory di lavoro corrente è <filename class="directory">/www/</filename>, + si può includere <filename>include/a.php</filename> e qui vi è <literal>include "b.php"</literal>, + il file <filename>b.php</filename> verrà prima cercato in <filename class="directory">/www/</filename> + e quindi in <filename class="directory">/www/include/</filename>. + Se il nome del file inizia con <literal>../</literal>, viene cercato solo nella + include_path relativa alla directory di lavoro corrente. </simpara> <simpara> Quando un file viene incluso, il codice che esso contiene eredita lo @@ -1151,7 +1342,7 @@ function foo() { -global $frutto; + global $frutto; include 'vars.php'; @@ -1182,8 +1373,9 @@ <simpara> Se "<link linkend="ini.allow-url-fopen">URL fopen wrappers</link>" nel PHP sono abilitati (come nella configurazione di default), - potete specificare il file da includere usando un URL (via HTTP) - invece che un percorso locale. Se il server chiamato interpreta + potete specificare il file da includere usando un URL (via HTTP o + altri wrapper supportati - vedere <xref linkend="wrappers"/> per avere la lista + dei protocolli supportati ) invece che un percorso locale. Se il server chiamato interpreta il file incluso come codice PHP, le variabili possono essere passate al file incluso usando una stringa di richiesta URL come con l'utilizzo di HTTP GET. Non è proprio parlare della stessa cosa includere il file e averlo @@ -1191,6 +1383,7 @@ eseguito su un server remoto e il risultato è poi stato incluso nello script locale. </simpara> + &warn.no-win32-fopen-wrapper; <para> <example> <title><function>include</function> attraverso HTTP</title> @@ -1198,8 +1391,8 @@ <![CDATA[ <?php -/* Questo esempio assume che www.example.com è configurato per eseguire file * - * .php e non file .txt. Anche, 'Funziona' qui significa che le variabili * +/* Questo esempio assume che www.example.com è configurato per eseguire file + * .php e non file .txt. Anche, 'Funziona' qui significa che le variabili * $foo e $bar sono disponibili all'interno del file incluso. */ // Non funzionerà; file.txt non è stato trattato da www.example.com come PHP @@ -1261,15 +1454,44 @@ in un file incluso per terminare l'esecuzione di quel file e restituirlo allo script che l'ha chiamato. È anche possibile restituire valori dai file inclusi. Potete prendere il valore di una chiamata di inclusione come - fareste con una normale funzione. + fareste con una normale funzione. Tuttavia questo non è possibile quando si include file + remoti, a meno che l'output del file remoto non contenga <link linkend="language.basic-syntax.phpmode">tag di inizio + e fine codice validi in PHP</link> (come i file locali). Si possono dichiarare variabili + all'interno di questi tag e queste saranno inserite nel punto in cui il + file è stato incluso. </simpara> - <note> - <simpara> - In PHP 3, return potrebbe non apparire in un blocco a meno che esso sia - un blocco di funzione, nel qual caso <function>return</function> si applica - a quella funzione e non all'intero file. - </simpara> - </note> + <para> + Poichè <function>include</function> è un costrutto del linguaggio speciale, + non richiede le parentesi per i propri argomenti. Fare attenzione quando lo si confronta + i valori restituiti. + <example> + <title>Confronto dei valori restituiti da include</title> + <programlisting role="php"> +<![CDATA[ +<?php +// non funziona, viene trattato come include(('vars.php') == 'OK'), ad esempio. include('') +if (include('vars.php') == 'OK') { + echo 'OK'; +} + +// funziona +if ((include 'vars.php') == 'OK') { + echo 'OK'; +} +?> +]]> + </programlisting> + </example> + </para> + <para> + <note> + <simpara> + In PHP 3, return potrebbe non apparire in un blocco a meno che esso sia + un blocco di funzione, nel qual caso <function>return</function> si applica + a quella funzione e non all'intero file. + </simpara> + </note> + </para> <para> <example> <title><function>include</function> and the <function>return</function> statement</title> @@ -1311,21 +1533,63 @@ <literal>$bar</literal> ha valore <literal>1</literal> perchè l'inclusione è stata eseguita con successo. Notare la differenza tra gli esempi sopra. Il primo usa <function>return</function> all'interno di un file incluso mentre l'altro no. - Pochi altri modi di "includere" file in variabili sono con - <function>fopen</function>, <function>file</function> o usando - <function>include</function> insieme con - <link linkend="ref.outcontrol">Output Control Functions</link>. + Se il file non può essere incluso la funzione restituisce &false; e genera + un messaggio di <literal>E_WARNING</literal> </simpara> - + <para> + Se esistono funzioni definite nel file di include, queste possono essere utilizzate + nel file principale a prescindere se esse siano prima o dopo il <function>return</function>. + Se un file viene incluso due volte, il PHP 5 genera un errore fatale, poichè le funzioni + sono già dichiarate, mentre il PHP 4 non considera le funzioni dichiarate + dopo il <function>return</function>. + Si raccomanda di utilizzare <function>include_once</function> invece di verificare + se un file è già stato incluso ed uscire tramite condizione dal + file incluso. + </para> + <simpara> + Un'altro metodo per "includere" file PHP in una variabile consiste nel catturarne + l'output tramite <link linkend="ref.outcontrol">le funzioni di controllo + dell'output</link> ed <function>include</function>. Ad esempio: + </simpara> + <para> + <example> + <title>Utilizzo del buffering dell'output per inserire un file PHP in una stringa</title> + <programlisting role="php"> +<![CDATA[ +<?php +$string = get_include_contents('somefile.php'); + +function get_include_contents($filename) { + if (is_file($filename)) { + ob_start(); + include $filename; + $contents = ob_get_contents(); + ob_end_clean(); + return $contents; + } + return false; +} + +?> +]]> + </programlisting> + </example> + </para> + <para> + Per includere automaticamente dei file negli script vedere i parametri + <link linkend="ini.auto-prepend-file">auto_prepend_file</link> e + <link linkend="ini.auto-append-file">auto_append_file</link> + nel &php.ini;. + </para> + + &note.language-construct; <simpara> Vedere anche <function>require</function>, <function>require_once</function>, <function>include_once</function>, <function>readfile</function>, <function>virtual</function>, e <link linkend="ini.include-path">include_path</link>. </simpara> - -</sect1> - + </sect1> <sect1 id="function.require-once"> <title><function>require_once</function></title> <para> @@ -1350,16 +1614,46 @@ <ulink url="&url.php.pear;">PEAR</ulink> incluso nell'ultima distribuzione del codice sorgente di PHP. </para> - <note> - <para> - <function>require_once</function> è stato aggiunto in PHP 4.0.1pl2 - </para> - </note> + <para> + Il valore restituito è simile a <function>include</function>. Se il file è + già stato incluso, la funzione restituisce &true;. + </para> + <para> + <note> + <para> + <function>require_once</function> è stato aggiunto in PHP 4.0.1pl2 + </para> + </note> + </para> + <para> + <note> + <para> + Fare attenzione al fatto che il comportamento di <function>require_once</function> + e <function>include_once</function> può non essere quello atteso in sistemi + che non distinguono le maiuscole dalle minuscole (tipo Windows). + <example> + <title><function>require_once</function> non distingue tra maiuscole e minuscole in Windows</title> + <programlisting role="php"> +<![CDATA[ +<?php +require_once("a.php"); // questo include include a.php +require_once("A.php"); // questo include a.php ancora, in Windows! (solo PHP 4) +?> +]]> + </programlisting> + </example> + Questo comportamento è stato modificato in PHP 5 - il percorso viene normalizzato, in modo tale che + <filename>C:\PROGRA~1\A.php</filename> diventa simile a + <filename>C:\Program Files\a.php</filename> e quindi il file vine incluso solo una volta. + </para> + </note> + </para> + &warn.no-win32-fopen-wrapper; <para> Vedere anche: <function>require</function>, <function>include</function>, <function>include_once</function>, <function>get_required_files</function>, - <function>get_included_files</function>, <function>readfile</function>, + <function>get_included_files</function>, <function>readfile</function> e <function>virtual</function>. </para> </sect1> @@ -1382,16 +1676,46 @@ riassegnazione di valori a variabili, etc. </para> <para> - Per maggiori esempi sull'utilizzo di <function>require_once</function> e - <function>include_once</function>, consultare il codice - <ulink url="&url.php.pear;">PEAR</ulink> incluso - nell'ultima distribuzione del codice sorgente di PHP. + Per maggiori esempi sull'utilizzo di <function>require_once</function> e + <function>include_once</function>, consultare il codice + <ulink url="&url.php.pear;">PEAR</ulink> incluso + nell'ultima distribuzione del codice sorgente di PHP. </para> - <note> - <para> + <para> + Il valore restituito è il simile a <function>include</function>. Se il file è già + stato incluso, la funzione restituisce &true;. + </para> + <para> + <note> + <para> <function>include_once</function> è stato aggiunto in PHP 4.0.1pl2 - </para> - </note> + </para> + </note> + </para> + <para> + <note> + <para> + Fare attenzione al fatto che il comportamento di <function>include_once</function> + e <function>require_once</function> può non essere quello atteso in sistemi + che non distinguono le maiuscole dalle minuscole (tipo Windows). + <example> + <title><function>include_once</function> non distingue tra maiuscole e minuscole in Windows</title> + <programlisting role="php"> +<![CDATA[ +<?php +include_once("a.php"); // questo include include a.php +include_once("A.php"); // questo include a.php ancora, in Windows! (solo PHP 4) +?> +]]> + </programlisting> + </example> + Questo comportamento è stato modificato in PHP 5 - il percorso viene normalizzato, in modo tale che + <filename>C:\PROGRA~1\A.php</filename> diventa simile a + <filename>C:\Program Files\a.php</filename> e quindi il file vine incluso solo una volta. + </para> + </note> + </para> + &warn.no-win32-fopen-wrapper; <para> Vedere anche <function>include</function>, <function>require</function>, <function>require_once</function>, http://cvs.php.net/diff.php/phpdoc-it/language/operators.xml?r1=1.9&r2=1.10&ty=u Index: phpdoc-it/language/operators.xml diff -u phpdoc-it/language/operators.xml:1.9 phpdoc-it/language/operators.xml:1.10 --- phpdoc-it/language/operators.xml:1.9 Thu Feb 5 05:14:30 2004 +++ phpdoc-it/language/operators.xml Tue May 31 08:29:50 2005 @@ -1,10 +1,28 @@ <?xml version="1.0" encoding="iso-8859-1"?> -<!-- EN-Revision: 1.35 Maintainer: spisto Status: ready --> +<!-- EN-Revision: 1.86 Maintainer: spisto Status: ready --> <chapter id="language.operators"> <title>Operatori</title> <simpara> + Un operatore è un qualcosa che si posiziona tra uno o più valori (od espressioni, + in gergo tecnico) e produce un'altro valore (in modo tale che la costruzione + stessa diventi a sua volta un'espressione). In questo modo si può considerare operatori le funzioni + o costruzioni che restituiscono valori (tipo print), e quelle che non restituiscono + nulla (come echo) possono essere considerate come altro tipo di funzione. </simpara> - + <para> + Esistono tre tipi di operatori. Una tipologia sono gli operatori unari, i quali richiedono + un solo valore, ad esempio ! (l'operatore di negazione) oppure ++ + (l'operatore di autoincremento). Nel secondo gruppo troviamo gli operatori binari; questi + costituiscono la maggior parte degli operatori disponibili in PHP, un e elenco di questi + è presente alla sezione <link linkend="language.operators.precedence">Precednza + degli operatori</link>. + </para> + <para> + Il terzo gruppo è costituito dal operatore ternario: ?:. Questo si può utilizzare + per selezionare un espressione tra due possibili, in base ad una terza; piuttosto che dovere scegliere + tra due righe di istruzioni o diversi percorsi di esecuzione. Racchiudere l'operatore ternario + tra parentesi tonde è una buona idea. + </para> <sect1 id="language.operators.precedence"> <title>Precedenza degli operatori</title> <para> @@ -15,11 +33,14 @@ ha una precedenza più alta rispetto all'operatore di addizione ("+"). Le parentesi possono essere usate per forzare la precedenza, se necessario. Per esempio: <literal>(1 + 5) * 3</literal> viene valutata - <literal>18</literal>. + <literal>18</literal>. Se la precedenza tra gli operatori è simile, si utilizza l'associazione + da sinistra a destra. </para> <para> La seguente tabella fornisce una lista della precedenza degli operatori con gli - operatori a più bassa precedenza listati prima. + operatori a più alta precedenza elencati prima. Gli operatori presenti nella medesima linea + hanno uguale precedenza, in questi casi la loro associativià + decide l'ordine con cui sono valutati. <table> <title>Precedenza degli operatori</title> <tgroup cols="2"> @@ -27,97 +48,180 @@ <row> <entry>Associatività</entry> <entry>Operatori</entry> + <entry>Informazioni aggiuntive</entry> </row> </thead> <tbody> <row> - <entry>sinistra</entry> - <entry>,</entry> - </row> - <row> - <entry>sinistra</entry> - <entry>or</entry> + <entry>non associativi</entry> + <entry>new</entry> + <entry><link linkend="language.oop5.basic.new">new</link></entry> </row> <row> - <entry>sinistra</entry> - <entry>xor</entry> + <entry>destra</entry> + <entry>[</entry> + <entry><function>array</function></entry> </row> <row> - <entry>sinistra</entry> - <entry>and</entry> + <entry>destra</entry> + <entry>! ~ ++ -- (int) (float) (string) (array) (object) @</entry> + <entry> + <link linkend="language.operators.increment">incremento/decremento</link> + </entry> </row> <row> <entry>destra</entry> - <entry>print</entry> + <entry>! ~ + - (int) (float) (string) (array) (object) @</entry> + <entry> + <link linkend="language.types">tipi</link> + </entry> </row> <row> <entry>sinistra</entry> + <entry>* / %</entry> <entry> - = += -= *= /= .= %= &amp;= |= ^= ~= &lt;&lt;= &gt;&gt;= + <link linkend="language.operators.arithmetic">operatori aritmetici</link> </entry> </row> <row> <entry>sinistra</entry> - <entry>? :</entry> + <entry>+ - .</entry> + <entry> + <link linkend="language.operators.arithmetic">operatori aritmetici</link>&listendand; + <link linkend="language.operators.string">operatori su stringhe</link></entry> </row> <row> <entry>sinistra</entry> - <entry>||</entry> + <entry>&lt;&lt; &gt;&gt;</entry> + <entry> + <link linkend="language.operators.bitwise">operatori sui bit</link> + </entry> </row> <row> - <entry>sinistra</entry> - <entry>&amp;&amp;</entry> + <entry>non associativi</entry> + <entry>&lt; &lt;= &gt; &gt;=</entry> + <entry> + <link linkend="language.operators.comparison">operatori di confronto</link> + </entry> + </row> + <row> + <entry>non associativi</entry> + <entry>== != === !==</entry> + <entry> + <link linkend="language.operators.comparison">operatori di confronto</link> + </entry> </row> <row> <entry>sinistra</entry> - <entry>|</entry> + <entry>&amp;</entry> + <entry> + <link linkend="language.operators.bitwise">operatori sui bit</link>&listendand; + <link linkend="language.references">riferimenti</link></entry> </row> <row> <entry>sinistra</entry> <entry>^</entry> + <entry> + <link linkend="language.operators.bitwise">operatori sui bit</link> + </entry> </row> <row> <entry>sinistra</entry> - <entry>&amp;</entry> + <entry>|</entry> + <entry> + <link linkend="language.operators.bitwise">operatori sui bit</link> + </entry> </row> <row> - <entry>non associativi</entry> - <entry>== != === !==</entry> + <entry>sinistra</entry> + <entry>&amp;&amp;</entry> + <entry> + <link linkend="language.operators.logical">operatori logici</link> + </entry> </row> <row> - <entry>non associativi</entry> - <entry>&lt; &lt;= &gt; &gt;=</entry> + <entry>sinistra</entry> + <entry>||</entry> + <entry> + <link linkend="language.operators.logical">operatori logici</link> + </entry> </row> <row> <entry>sinistra</entry> - <entry>&lt;&lt; &gt;&gt;</entry> + <entry>? :</entry> + <entry> + <link linkend="language.operators.comparison.ternary">Operatore ternario</link> + </entry> </row> <row> <entry>sinistra</entry> - <entry>+ - .</entry> + <entry> + = += -= *= /= .= %= &amp;= |= ^= ~= &lt;&lt;= &gt;&gt;= + </entry> + <entry> + <link linkend="language.operators.assignment">operatori di assegnazione</link> + </entry> </row> <row> <entry>sinistra</entry> - <entry>* / %</entry> - </row> + <entry>and</entry> + <entry> + <link linkend="language.operators.logical">operatori logici</link> + </entry> + </row> <row> - <entry>destra</entry> - <entry>! ~ ++ -- (int) (float) (string) (array) (object) @</entry> + <entry>sinistra</entry> + <entry>xor</entry> + <entry> + <link linkend="language.operators.logical">operatori logici</link> + </entry> </row> <row> - <entry>destra</entry> - <entry>[</entry> + <entry>sinistra</entry> + <entry>or</entry> + <entry> + <link linkend="language.operators.logical">operatori logici</link> + </entry> </row> <row> - <entry>non associativi</entry> - <entry>new</entry> + <entry>sinistra</entry> + <entry>,</entry> + <entry>diversi usi</entry> </row> </tbody> </tgroup> </table> </para> + <para> + L'associazione a sinistra indica che l'espressione viene valutata da sinistra verso destra, + l'associazione destra indica il contrario. + <example> + <title>Associatività</title> + <programlisting role="php"> +<![CDATA[ +<?php +$a = 3 * 3 % 5; // (3 * 3) % 5 = 4 +$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2 + +$a = 1; +$b = 2; +$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5 +?> +]]> + </programlisting> + </example> + Utilizzare le parentesi per aumentare la leggibilità del codice. + </para> + <note> + <para> + Sebbene <literal>!</literal> abbia una maggiore pecedenza rispetto a + <literal>=</literal>, il PHP cintinua a permetter espressioni + tipo la seguente: <literal>if (!$a = foo())</literal>, + in questo caso l'output di <literal>foo()</literal> viene + inserito in <varname>$a</varname>. + </para> + </note> </sect1> - <sect1 id="language.operators.arithmetic"> <title>Operatori aritmetici</title> <simpara> @@ -136,6 +240,11 @@ </thead> <tbody> <row> + <entry>-$a</entry> + <entry>Negazione</entry> + <entry>Opposto di $a.</entry> + </row> + <row> <entry>$a + $b</entry> <entry>Addizione</entry> <entry>La somma di $a e $b.</entry> @@ -168,7 +277,16 @@ anche se i due operandi sono interi (oppure stringhe che vengono convertite in interi). </simpara> - + <note> + <simpara> + Il resto <literal>$a % $b</literal> è negativo per + <literal>$a</literal> negativo. + </simpara> + </note> + <simpara> + Vedere anche le pagine del manuale sulle + <link linkend="ref.math">funzioni matematiche</link>. + </simpara> <!-- <simpara> L'operatore di divisione ("/") restituisce un valore intero (il risultato @@ -196,23 +314,28 @@ <informalexample> <programlisting role="php"> <![CDATA[ +<?php $a = ($b = 4) + 5; // $a è uguale a 9 ora, e $b è stato impostato a 4. +?> ]]> </programlisting> </informalexample> </para> <para> In aggiunta all'operatore di base dell'assegnazione, ci sono gli "operatori - combinati" per tutta l'aritmetica binaria e gli operatori di stringa + combinati" per tutta <link linkend="language.operators">l'aritmetica binaria</link> + e gli operatori di stringa che vi consentono di usare un valore in un'espressione e poi impostare il suo valore al risultato di quell'espressione. Per esempio: <informalexample> <programlisting role="php"> <![CDATA[ +<?php $a = 3; $a += 5; // imposta $a a 8, come se avessimo detto: $a = $a + 5; $b = "Ciao "; $b .= "Lì!"; // imposta $b a "Ciao Lì!", proprio come $b = $b . "Lì!"; +?> ]]> </programlisting> </informalexample> @@ -221,7 +344,7 @@ Notare che l'assegnazione copia la variabile originale alla nuova (assegnazione per valore), così i cambiamenti ad una non si verificheranno nell' altra. Ciò può anche avere rilevanza se avete bisogno di copiare qualcosa - come un grande array in un ciclo molto stretto. PHP 4 supporta l'assegnazione + come un grande array in un ciclo molto stretto. Dal PHP 4 viene supportato l'assegnazione per riferimento, usando la sintassi <computeroutput>$var = &amp;$othervar;</computeroutput>, ma ciò non è possibile in PHP 3. 'L'assegnazione per riferimento' vuol dire che entrambe le variabili @@ -236,20 +359,18 @@ <simpara> Gli operatori bitwise vi permettono di alterare bit specifici in posizione on oppure off. Se entrambi i parametri di sinistra e destra sono - stringhe, l'operatore bitwise opererà sui caratteri di questa - stringa. + stringhe, l'operatore bitwise opererà sui caratteri ASCII + della stringa. </simpara> <para> <informalexample> - <programlisting> + <programlisting role="php"> <![CDATA[ <?php - echo 12 ^ 9; // L'output è '5' - - echo "12" ^ "9"; // L'output è il carattere Backspace (ascii 8) +echo 12 ^ 9; // L'output è '5' +echo "12" ^ "9"; // L'output è il carattere Backspace (ascii 8) // ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8 - - echo "hallo" ^ "hello"; // L'output è il valore ascii #0 #4 #0 #0 #0 +echo "hallo" ^ "hello"; // L'output è il valore ascii #0 #4 #0 #0 #0 // 'a' ^ 'e' = #4 ?> ]]> @@ -311,13 +432,21 @@ </tbody> </tgroup> </table> + <warning> + <para> + Non spostare a destra per più di 32 bit sui sistemi a 32 bit. Non spostare + a sinistra nei casi in cui il risultato è un numero più lungo di 32 bit. + </para> + </warning> </sect1> <sect1 id="language.operators.comparison"> <title>Operatori di confronto</title> <simpara> Gli operatori di confronto, come suggerisce il loro nome, permettono di confrontare - due valori. + due valori. Può essere interessante vedere la + <link linkend="types.comparisons">tabella di raffronto dei tipi</link>, + dato che mostra esempi di vari confronti tra i tipi di variabili. </simpara> <table> <title>Operatori di confronto</title> @@ -340,7 +469,7 @@ <entry>Identico</entry> <entry> &true; se $a è uguale a $b, ed essi sono dello stesso - tipo. (Solo PHP 4) + tipo. (Dal PHP 4) </entry> </row> <row> @@ -349,7 +478,7 @@ <entry>&true; se $a è diverso da $b.</entry> </row> <row> - <entry>$a &lt;> $b</entry> + <entry>$a &lt;&gt; $b</entry> <entry>Diversi</entry> <entry>&true; se $a è diverso da $b.</entry> </row> @@ -358,7 +487,7 @@ <entry>Non identici</entry> <entry> &true; se $a è diverso da $b, o se essi non sono dello stesso - tipo. (Solo PHP 4) + tipo. (Dal PHP 4) </entry> </row> <row> @@ -385,20 +514,69 @@ </tgroup> </table> <para> - Un altro operatore condizionale è l'operatore "?:" (o ternario), - che opera come in C e molti altri linguaggi. + Se si confronta interi con stringhe, la stringa viene + <link linkend="language.types.string.conversion">convertita in numero</link>. + Se si confronta due stringhe numeriche, queste vengono confrontate come interi. Queste + regole valgono anche per l'istruzione + <link linkend="control-structures.switch">switch</link>. <informalexample> - <programlisting> + <programlisting role="php"> <![CDATA[ -(espressione1) ? (espressione2) : (espressione3); +<?php +var_dump(0 == "a"); // 0 == 0 -> true +var_dump("1" == "01"); // 1 == 1 -> true + +switch ("a") { +case 0: + echo "0"; + break; +case "a": // mai raggiunta perchè "a" è già riconosciuta come 0 + echo "a"; + break; +} +?> ]]> </programlisting> </informalexample> - Questa espressione vale <replaceable>espressione2</replaceable> se - <replaceable>espressione1</replaceable> è &true;, e - <replaceable>espressione3</replaceable> se - <replaceable>espressione1</replaceable> è &false;. </para> + <para> + Vedere anche <function>strcasecmp</function>, + <function>strcmp</function>, + <link linkend="language.operators.array">Array operators</link>, + e la sezione del manuale su + <link linkend="language.types">Types</link>. + </para> + + <sect2 id="language.operators.comparison.ternary"> + <title>Operatore ternario</title> + <para> + Un'altro operatore condizionale è l'operatore ternario "?:". + <example> + <title>Assegnazione di un valore di default</title> + <programlisting role="php"> +<![CDATA[ +<?php +// Esempio di utilizzo dell'operatore ternario +$action = (empty($_POST['action'])) ? 'default' : $_POST['action']; + +// La riga precedente è simile a +if (empty($_POST['action'])) { + $action = 'default'; +} else { + $action = $_POST['action']; +} + +?> +]]> + </programlisting> + </example> + L'espressione <literal>(espressione1) ? (espressione2) : (espressione3)</literal> + vale <replaceable>espressione2</replaceable> se + <replaceable>espressione1</replaceable> è &true;, e + <replaceable>espressione3</replaceable> se + <replaceable>espressione1</replaceable> è &false;. + </para> + </sect2> </sect1> <sect1 id="language.operators.errorcontrol"> @@ -409,9 +587,10 @@ essere generato da quella espressione sarà ignorato. </simpara> <simpara> - Se la caratteristica <link linkend="ini.track-errors">track_errors</link> + Se la caratteristica <link linkend="ini.track-errors"><option>track_errors</option></link> è abilitata, qualsiasi messaggio di errore generato dall'espressione - sarà salvato nella variabile globale $php_errormsg. Questa variabile + sarà salvato nella variabile globale + <link linkend="reserved.variables.phperrormsg">$php_errormsg</link>. Questa variabile sarà sovrascritta ad ogni errore, così controllatela subito se volete usarla. </simpara> @@ -435,7 +614,8 @@ </para> <note> <simpara> - L'operatore @ funziona solo sulle espressioni. Una semplice regola di thumb + L'operatore @ funziona solo sulle + <link linkend="language.expressions">espressioni</link>. Una semplice regola è: se potete prendere il valore di qualcosa, potete anteporre ad esso l'operatore @. Per esempio, potete anteporre esso a variabili, funzioni e chiamate ad <function>include</function>, costanti, e @@ -445,7 +625,8 @@ </simpara> </note> <simpara> - Vedere anche <function>error_reporting</function>. + Vedere anche <function>error_reporting</function> e la sezione del manuale + <link linkend="ref.errorfunc">Gestione degli errori e funzioni di log</link>. </simpara> <warning> <para> @@ -466,27 +647,31 @@ quelli non sono apostrofi! PHP cercherà di eseguire il contenuto dei backticks come comando di shell; sarà restituito l'output (i.e., non sarà semplicemente esportato come output; può - essere assegnato ad una variabile). + essere assegnato ad una variabile). L'uso dell'operatore backtick è identico + alla funzione <function>shell_exec</function>. <informalexample> <programlisting role="php"> <![CDATA[ +<?php $output = `ls -al`; echo "<pre>$output</pre>"; +?> ]]> </programlisting> </informalexample> </para> <note> <para> - L'operatore backtick è disabilitato quando è abilitata <link - linkend="ini.safe-mode">safe mode</link> + L'operatore backtick è disabilitato quando è abilitata &safemode; oppure quando è disabilitata <function>shell_exec</function>. </para> </note> <para> - Vedere anche <function>escapeshellcmd</function>, <function>exec</function>, - <function>passthru</function>, <function>popen</function>, - <function>shell_exec</function> e <function>system</function>. + Vedere anche la sezione del manuale <link linkend="ref.exec">Funzioni + per l'esecuzione di programmi</link>, <function>popen</function>, + <function>proc_open</function> e + <link linkend="features.commandline">Utilizzo del PHP da + linea di comando</link>. </para> </sect1> @@ -536,32 +721,62 @@ <programlisting role="php"> <![CDATA[ <?php -echo "<h3&gt;Post-incremento</h3&gt;"; +echo "<h3>Postincrement</h3>"; $a = 5; -echo "Dovrebbe essere 5: " . $a++ . "<br>\n"; -echo "Dovrebbe essere 6: " . $a . "<br>\n"; +echo "Dovrebbe essere 5: " . $a++ . "<br />\n"; +echo "Dovrebbe essere 6: " . $a . "<br />\n"; echo "<h3>Pre-incremento</h3>"; $a = 5; -echo "Dovrebbe essere 6: " . ++$a . "<br>\n"; -echo "Dovrebbe essere 6: " . $a . "<br>\n"; +echo "Dovrebbe essere 6: " . ++$a . "<br />\n"; +echo "Dovrebbe essere 6: " . $a . "<br />\n"; echo "<h3>Post-decremento</h3>"; $a = 5; -echo "Dovrebbe essere 5: " . $a-- . "<br>\n"; -echo "Dovrebbe essere 4: " . $a . "<br>\n"; +echo "Dovrebbe essere 5: " . $a-- . "<br />\n"; +echo "Dovrebbe essere 4: " . $a . "<br />\n"; echo "<h3>Pre-decremento</h3>"; $a = 5; -echo "Dovrebbe essere 4: " . --$a . "<br>\n"; -echo "Dovrebbe essere 4: " . $a . "<br>\n"; +echo "Dovrebbe essere 4: " . --$a . "<br />\n"; +echo "Dovrebbe essere 4: " . $a . "<br />\n"; ?> ]]> </programlisting> </informalexample> + </para> + <para> + Il PHP segue le convenzioni di Perl e non del C quando tratta le operazioni matematiche + sui caratteri. Ad esempio, in Perl 'Z'+1 restituisce + 'AA', mentre in C 'Z'+1 restituisce '[' ( ord('Z') == 90, ord('[') == 91 ). + Attenzione che le variabili con caratteri possono essere sommate e non sottratte. + <example> + <title>Operazioni aritmetiche su variabili stringa</title> + <programlisting role="php"> +<![CDATA[ +<?php +$i = 'W'; +for($n=0; $n<6; $n++) + echo ++$i . "\n"; +]]> + </programlisting> + &example.outputs; + <screen> +<![CDATA[ +X +Y +Z +AA +AB +AC +]]> + </screen> + </example> + </para> + <para> + Incrementare o decrementare valori booleani non ha effetto. </para> </sect1> - <sect1 id="language.operators.logical"> <title>Operatori logici</title> @@ -620,7 +835,7 @@ <sect1 id="language.operators.string"> <title>Operatori di stringa</title> <simpara> - Ci sono due operatori di stringa. Il primo è l'operatore di + Ci sono due operatori di <type>stringa</type>. Il primo è l'operatore di concatenazione ('.'), che restituisce la concatenazione dei suoi argomenti a destra e a sinistra. Il secondo è l'operatore di assegnazione concatenata ('.='), che aggiunge alla fine dell'argomento sul lato destro @@ -633,17 +848,186 @@ <informalexample> <programlisting role="php"> <![CDATA[ +<?php $a = "Ciao "; $b = $a . "Mondo!"; // ora $b contiene "Ciao Mondo!" $a = "Ciao "; $a .= "Mondo!"; // ora $a contiene "Ciao Mondo!" +?> ]]> </programlisting> </informalexample> </para> + <para> + Vedere anche le sezioni + <link linkend="language.types.string">Stringhe</link> e + <link linkend="ref.strings">Funzioni per le stringhe</link> nel manuale. + </para> + </sect1> + + <sect1 id="language.operators.array"> + <title>Operatori per matrici</title> + <table> + <title>Operatori per matrici</title> + <tgroup cols="3"> + <thead> + <row> + <entry>Esempio</entry> + <entry>Nome</entry> + <entry>Risultato</entry> + </row> + </thead> + <tbody> + <row> + <entry>$a + $b</entry> + <entry>Unione</entry> + <entry>Unione di $a e $b.</entry> + </row> + <row> + <entry>$a == $b</entry> + <entry>Uguaglianza</entry> + <entry>&true; se $a e $b hanno le stesse coppie di chiavi/valori.</entry> + </row> + <row> + <entry>$a === $b</entry> + <entry>Identità</entry> + <entry>&true; se $a e $b hanno le stesse coppie di chiavi/valori nel + medesimo ordine e dl medesimo tipo.</entry> + </row> + <row> + <entry>$a != $b</entry> + <entry>Disuguaglianza</entry> + <entry>&true; se $a non è uguale a $b.</entry> + </row> + <row> + <entry>$a &lt;&gt; $b</entry> + <entry>Disuguaglianza</entry> + <entry>&true; se $a non è uguale a $b.</entry> + </row> + <row> + <entry>$a !== $b</entry> + <entry>Non-identità</entry> + <entry>&true; se $a non è identico a $b.</entry> + </row> + </tbody> + </tgroup> + </table> + <para> + L'operatore <literal>+</literal> + aggiunge la matrice di destra a quella di sinistra, mentre le + chiavi duplicate NON sono sovrascritte. + </para> + <para> + <informalexample> + <programlisting role="php"> +<![CDATA[ +<?php +$a = array("a" => "apple", "b" => "banana"); +$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry"); + +$c = $a + $b; // Unione di $a e $b +echo "Union of \$a and \$b: \n"; +var_dump($c); + +$c = $b + $a; // Unione di $b e $a +echo "Union of \$b and \$a: \n"; +var_dump($c); +?> +]]> + </programlisting> + </informalexample> + Una volta eseguito, lo script visualizzerà: + <screen role="php"> +<![CDATA[ +Union of $a and $b: +array(3) { + ["a"]=> + string(5) "apple" + ["b"]=> + string(6) "banana" + ["c"]=> + string(6) "cherry" +} +Union of $b and $a: +array(3) { + ["a"]=> + string(4) "pear" + ["b"]=> + string(10) "strawberry" + ["c"]=> + string(6) "cherry" +} +]]> + </screen> + </para> + <para> + Gli elementi di una matrice sono uguali nel confronto se hanno le + stesse chiavi e gli stessi valori. + </para> + <para> + <example> + <title>Confrontare le matrici</title> + <programlisting role="php"> +<![CDATA[ +<?php +$a = array("apple", "banana"); +$b = array(1 => "banana", "0" => "apple"); + +var_dump($a == $b); // bool(true) +var_dump($a === $b); // bool(false) +?> +]]> + </programlisting> + </example> + </para> + <para> + Vedere anche la sezione del manuale sulle + <link linkend="language.types.array">Matrici</link> e + <link linkend="ref.array">Funzioni per le matrici</link>. + </para> + </sect1> + <sect1 id="language.operators.type"> + <title>Operatori di tipi</title> + <para> + PHP ha un unico operatore di tipo: <literal>instanceof</literal>. + <literal>instanceof</literal> è utilizzato per determinare se un dato + oggetto appartiene ad una data <link linkend="language.oop">classe di oggetti</link>. + </para> + <simpara> + L'operatore <literal>instanceof</literal> è stato introdotto in PHP 5. + Prima di questo si utilizzava <function>is_a</function>, ma ora + <function>is_a</function> viene sconsigliato in favore di + <literal>instanceof</literal>. + </simpara> + <informalexample> + <programlisting> +<![CDATA[ +<?php +class A { } +class B { } + +$thing = new A; +if ($thing instanceof A) { + echo 'A'; +} +if ($thing instanceof B) { + echo 'B'; +} +?> +]]> + </programlisting> + <simpara> + Poichè <varname>$thing</varname> è un <type>oggetto</type> di tipo A, ma + non di tipo B, sarà eseguito soltanto il blocco dipendente dal tipo A: + </simpara> + <screen>A</screen> + </informalexample> + <para> + Vedere anche <function>get_class</function> e + <function>is_a</function>. + </para> </sect1> - </chapter> <!-- Keep this comment at the end of the file http://cvs.php.net/diff.php/phpdoc-it/language/references.xml?r1=1.4&r2=1.5&ty=u Index: phpdoc-it/language/references.xml diff -u phpdoc-it/language/references.xml:1.4 phpdoc-it/language/references.xml:1.5 --- phpdoc-it/language/references.xml:1.4 Sat Mar 8 14:57:57 2003 +++ phpdoc-it/language/references.xml Tue May 31 08:29:50 2005 @@ -1,332 +1,332 @@ -<?xml version="1.0" encoding="iso-8859-1"?> -<!-- EN-Revision: 1.24 Maintainer: alan_dangelo Status: ready --> - <chapter id="language.references"> - <title>Spiegazioni sui riferimenti</title> - - <sect1 id="language.references.whatare"> - <title>Cosa sono i riferimenti</title> - <simpara> - I riferimenti in PHP sono il mezzo per accedere ad uno stesso contenuto di variabile - utilizzando diversi nomi. Non si sta parlando di puntatori come in C, ma di alias - nella tabella dei simboli. Si noti che in PHP, il nome delle variabili e il loro contenuto - sono cose diverse, uno stesso contenuto infatti pu&ograve; avere nomi diversi. - L'analogia pi&ugrave; prossima è quella con i nomi dei file e i file stessi in Unix - - i nomi delle variabili sono come directory, mentre il contenuto delle variabili &egrave; - il file stesso. I riferimenti possono essere pensati come hardlink del - filesystem Unix. - </simpara> - </sect1> - - <sect1 id="language.references.whatdo"> - <title>Che cosa fanno i riferimenti</title> - <para> - I riferimenti permettono di creare due o più variabili che si riferiscono allo - stesso contenuto. Questo significa, che scrivendo: - <informalexample> - <programlisting role="php"> -<![CDATA[ -$a =& $b -]]> - </programlisting> - </informalexample> - <varname>$a</varname> e <varname>$b</varname> - puntano alla stessa variabile. - <note> - <para> - <varname>$a</varname> e <varname>$b</varname> sono completamente - uguali, ma <varname>$a</varname> non è un puntatore a - <varname>$b</varname> o vice versa, - <varname>$a</varname> e <varname>$b</varname> puntano semplicemente nello - stesso posto. - </para> - </note> - </para> - <para> - Questa sintassi si pu&ograve; usare con le funzioni, nella restituzione per riferimento, - e con l'operatore <literal>new</literal> (da PHP 4.0.4 in poi): - <informalexample> - <programlisting role="php"> -<![CDATA[ -$bar =& new fooclass(); -$foo =& find_var ($bar); -]]> - </programlisting> - </informalexample> - </para> - <note> - <para> - Se non si usa l'operatore <literal>&amp;</literal> l'oggeto appena creato - viene copiato. Usando <literal>$this</literal> in una classe, - opererà sulla sua istanza corrente. L'assegnazione senza - <literal>&amp;</literal> copia perci&ograve; l'istanza (l'oggetto) e - <literal>$this</literal> opera sulla copia, che non &egrave; sempre ciò che - si desidera. Normalmente si lavora su una singola istanza di oggetto, - sia per motivi di prestazioni che di consumo di memoria. - </para> - <para> - Utilizzando l'operatore <literal>@</literal> con new, si <emphasis>sopprimono - </emphasis> gli errori nel costruttore in questo modo - <literal>@new</literal>, il metodo per&ograve; non funziona se si usa l'istruzione - <literal>&amp;new</literal>. Questa è una limitazione dello Zend - Engine e provoca un parser error. - </para> - </note> - <para> - Il secondo utilizzo del riferimento è il passaggio di una variabile - per riferimento. Questo si fa dichiarando una variabile locale di una funzione e - una variabile nell'ambito della chiamata del riferimento con lo stesso contenuto. Esempio: - <informalexample> - <programlisting role="php"> -<![CDATA[ -function foo(&$var) -{ - $var++; -} - -$a=5; -foo($a); -]]> - </programlisting> - </informalexample> - <varname>$a</varname> assume il valore 6. Questo accade perchè - nella funzione <varname>foo</varname>, la variabile - <varname>$var</varname> si riferisce allo stesso contenuto di - <varname>$a</varname>. Si vedano le spiegazioni più dettagliate per <link - linkend="language.references.pass">passaggio per riferimento</link>. - </para> - <simpara> - Il terzo utilizzo del riferimento è il <link - linkend="language.references.return">ritorno per riferimento</link>. - </simpara> - </sect1> - - <sect1 id="language.references.arent"> - <title>Cosa i riferimenti non sono</title> - <para> - Come detto prima, i riferimenti non sono puntatori. Questo significa, che - il seguente costrutto non fà quello che ci si aspetterebbe: - <informalexample> - <programlisting role="php"> -<![CDATA[ -function foo (&$var) -{ - $var =& $GLOBALS["baz"]; -} -foo($bar); -]]> - </programlisting> - </informalexample> - </para> - <simpara> - Nell'esempio <varname>$var</varname> in - <varname>foo</varname> viene scambiato con - <varname>$bar</varname> nella chiamata, e poi - riscambiato con <varname>$GLOBALS["baz"]</varname>. Questo non è il modo - per collegare <varname>$bar</varname> nell'ambito della chiamata con qualcos'altro - usando il meccanismo di riferimento, poichè <varname>$bar</varname> non è - disponibile nella funzione <varname>foo</varname> (è rappresentato da - <varname>$var</varname>, ma <varname>$var</varname> possiede soltanto - il contenuto della variabile e non il nome del valore collegato nella tabella - dei simboli). - </simpara> - </sect1> - - <sect1 id="language.references.pass"> - <title>Passaggio per riferimento</title> - <para> - Si può passare una variabile ad una funzione per riferimento, modificandone gli argomenti. - La sintassi è la seguente: - <informalexample> - <programlisting role="php"> -<![CDATA[ -function foo(&$var) -{ - $var++; -} - -$a=5; -foo($a); -// $a adesso è 6 -]]> - </programlisting> - </informalexample> - Nota che non si usa il segno di riferimento nella chiamata della funzione, ma solo - nella definizione. La definizione della funzione basta da sola - per passare correttamente un argomento per riferimento. - </para> - <para> - Le seguenti cose possono essere passate per riferimento: - <itemizedlist> - <listitem> - <simpara> - Variabili, es. <literal>foo($a)</literal> - </simpara> - </listitem> - <listitem> - <simpara> - Operatore New, es. <literal>foo(new foobar())</literal> - </simpara> - </listitem> - <listitem> - <para> - Riferimento restituito da una funazione, es. - <informalexample> - <programlisting role="php"> -<![CDATA[ -function &bar() -{ - $a = 5; - return $a; -} -foo(bar()); -]]> - </programlisting> - </informalexample> - Vedi anche le spiegazioni sulla <link - linkend="language.references.return">restituzione per riferimento</link>. - </para> - </listitem> - </itemizedlist> - </para> - <para> - Qualunque altra cosa non dovrebbe essere passata per riferimento, poichè - il risultato sarebbe indefinito. Per esempio, il seguente passaggio - per riferimento non è valido: - <informalexample> - <programlisting role="php"> -<![CDATA[ -function bar() // Nota l'assenza di & -{ - $a = 5; - return $a; -} - -foo(bar()); -foo($a = 5) // Expressione: non una variabile -foo(5) // Constante: non una variabile -]]> - </programlisting> - </informalexample> - Questi requisiti sono validi per PHP 4.0.4 e seguenti. - </para> - </sect1> - - <sect1 id="language.references.return"> - <title>Restituzione per riferimento</title> - <para> - La restituzione per riferimento è utile quando si vuole usare una funzione - per trovare quale variabile un riferimento dovrebbe limitare. Per - restituire per riferimento, si usa questa sintassi: - <informalexample> - <programlisting role="php"> -<![CDATA[ -function &find_var($param) -{ - ...codice... - return $found_var; -} - -$foo =& find_var($bar); -$foo->x = 2; -]]> - </programlisting> - </informalexample> - In questo esempio, la proprietà dell'oggetto restituito dalla funzione - <varname>find_var</varname> viene impostata, non la - copia, come sarebbe stato senza l'uso della sintassi del riferimento. - </para> - <note> - <simpara> - Diversamente dal passaggio di un parametro, bisogna utilizzare - <literal>&amp;</literal> in entrambi i posti - nella dichiarazione per indicare che - si vuole restituire per riferimento, e non per copia come di consueto, - e per indicare nella chiamata, il collegamento del riferimento, piuttosto che l'usuale - assegnazione che verrebbe fatta per <varname>$foo</varname>. - </simpara> - </note> - </sect1> - - <sect1 id="language.references.unset"> - <title>Cancellare riferimenti</title> - <para> - Quando si cancella un riferimento, si rompe il collegamento tra il - nome della variabile e il contenuto della variabile. Questo non significa - che il contenuto della variabile venga distrutto. Per esempio: - <informalexample> - <programlisting role="php"> -<![CDATA[ -$a = 1; -$b =& $a; -unset ($a); -]]> - </programlisting> - </informalexample> - non cancella <varname>$b</varname>, ma solo <varname>$a</varname>. - </para> - <simpara> - Di nuovo, può essere utile pensare a questo con un'analogia col comendo Unix - <command>unlink</command>. - </simpara> - </sect1> - - <sect1 id="language.references.spot"> - <title>Spotting References</title> - <simpara> - Diversi costrutti in PHP sono implementati attraverso il meccanismo dei - riferimenti, dove ogni cosa detta precedentemente, si applica anche a - questi costrutti. Alcuni, come il passaggio e la - restituzione per riferimento, sono stati menzionati sopra, gli - altri sono: - </simpara> - - <sect2 id="references.global"> - <title>Il riferimento <literal>global</literal></title> - <para> - Quando si dichiara una variabile come <command>global $var</command> di fatto - si crea un riferimento ad una variabile globale. Questo ha lo stesso significato, - dell'espressione: - <informalexample> - <programlisting role="php"> -<![CDATA[ -$var =& $GLOBALS["var"]; -]]> - </programlisting> - </informalexample> - </para> - <simpara> - Questo significa, per esempio, che cancellando <varname>$var</varname> - non si cancella la variabile globale. - </simpara> - </sect2> - - <sect2 id="references.this"> - <title><literal>$this</literal></title> - <simpara> - In un metodo di un oggetto, <varname>$this</varname> è sempre un riferimento - all'oggetto chiamante. - </simpara> - </sect2> - </sect1> - - </chapter> - -<!-- Keep this comment at the end of the file -Local variables: -mode: sgml -sgml-omittag:t -sgml-shorttag:t -sgml-minimize-attributes:nil -sgml-always-quote-attributes:t -sgml-indent-step:1 -sgml-indent-data:t -indent-tabs-mode:nil -sgml-parent-document:nil -sgml-default-dtd-file:"../../manual.ced" -sgml-exposed-tags:nil -sgml-local-catalogs:nil -sgml-local-ecat-files:nil -End: -vim600: syn=xml fen fdm=syntax fdl=2 si -vim: et tw=78 syn=sgml -vi: ts=1 sw=1 ---> +<?xml version="1.0" encoding="iso-8859-1"?> +<!-- EN-Revision: 1.24 Maintainer: alan_dangelo Status: ready --> + <chapter id="language.references"> + <title>Spiegazioni sui riferimenti</title> + + <sect1 id="language.references.whatare"> + <title>Cosa sono i riferimenti</title> + <simpara> + I riferimenti in PHP sono il mezzo per accedere ad uno stesso contenuto di variabile + utilizzando diversi nomi. Non si sta parlando di puntatori come in C, ma di alias + nella tabella dei simboli. Si noti che in PHP, il nome delle variabili e il loro contenuto + sono cose diverse, uno stesso contenuto infatti pu&ograve; avere nomi diversi. + L'analogia pi&ugrave; prossima è quella con i nomi dei file e i file stessi in Unix - + i nomi delle variabili sono come directory, mentre il contenuto delle variabili &egrave; + il file stesso. I riferimenti possono essere pensati come hardlink del + filesystem Unix. + </simpara> + </sect1> + + <sect1 id="language.references.whatdo"> + <title>Che cosa fanno i riferimenti</title> + <para> + I riferimenti permettono di creare due o più variabili che si riferiscono allo + stesso contenuto. Questo significa, che scrivendo: + <informalexample> + <programlisting role="php"> +<![CDATA[ +$a =& $b +]]> + </programlisting> + </informalexample> + <varname>$a</varname> e <varname>$b</varname> + puntano alla stessa variabile. + <note> + <para> + <varname>$a</varname> e <varname>$b</varname> sono completamente + uguali, ma <varname>$a</varname> non è un puntatore a + <varname>$b</varname> o vice versa, + <varname>$a</varname> e <varname>$b</varname> puntano semplicemente nello + stesso posto. + </para> + </note> + </para> + <para> + Questa sintassi si pu&ograve; usare con le funzioni, nella restituzione per riferimento, + e con l'operatore <literal>new</literal> (da PHP 4.0.4 in poi): + <informalexample> + <programlisting role="php"> +<![CDATA[ +$bar =& new fooclass(); +$foo =& find_var ($bar); +]]> + </programlisting> + </informalexample> + </para> + <note> + <para> + Se non si usa l'operatore <literal>&amp;</literal> l'oggeto appena creato + viene copiato. Usando <literal>$this</literal> in una classe, + opererà sulla sua istanza corrente. L'assegnazione senza + <literal>&amp;</literal> copia perci&ograve; l'istanza (l'oggetto) e + <literal>$this</literal> opera sulla copia, che non &egrave; sempre ciò che + si desidera. Normalmente si lavora su una singola istanza di oggetto, + sia per motivi di prestazioni che di consumo di memoria. + </para> + <para> + Utilizzando l'operatore <literal>@</literal> con new, si <emphasis>sopprimono + </emphasis> gli errori nel costruttore in questo modo + <literal>@new</literal>, il metodo per&ograve; non funziona se si usa l'istruzione + <literal>&amp;new</literal>. Questa è una limitazione dello Zend + Engine e provoca un parser error. + </para> + </note> + <para> + Il secondo utilizzo del riferimento è il passaggio di una variabile + per riferimento. Questo si fa dichiarando una variabile locale di una funzione e + una variabile nell'ambito della chiamata del riferimento con lo stesso contenuto. Esempio: + <informalexample> + <programlisting role="php"> +<![CDATA[ +function foo(&$var) +{ + $var++; +} + +$a=5; +foo($a); +]]> + </programlisting> + </informalexample> + <varname>$a</varname> assume il valore 6. Questo accade perchè + nella funzione <varname>foo</varname>, la variabile + <varname>$var</varname> si riferisce allo stesso contenuto di + <varname>$a</varname>. Si vedano le spiegazioni più dettagliate per <link + linkend="language.references.pass">passaggio per riferimento</link>. + </para> + <simpara> + Il terzo utilizzo del riferimento è il <link + linkend="language.references.return">ritorno per riferimento</link>. + </simpara> + </sect1> + + <sect1 id="language.references.arent"> + <title>Cosa i riferimenti non sono</title> + <para> + Come detto prima, i riferimenti non sono puntatori. Questo significa, che + il seguente costrutto non fà quello che ci si aspetterebbe: + <informalexample> + <programlisting role="php"> +<![CDATA[ +function foo (&$var) +{ + $var =& $GLOBALS["baz"]; +} +foo($bar); +]]> + </programlisting> + </informalexample> + </para> + <simpara> + Nell'esempio <varname>$var</varname> in + <varname>foo</varname> viene scambiato con + <varname>$bar</varname> nella chiamata, e poi + riscambiato con <varname>$GLOBALS["baz"]</varname>. Questo non è il modo + per collegare <varname>$bar</varname> nell'ambito della chiamata con qualcos'altro + usando il meccanismo di riferimento, poichè <varname>$bar</varname> non è + disponibile nella funzione <varname>foo</varname> (è rappresentato da + <varname>$var</varname>, ma <varname>$var</varname> possiede soltanto + il contenuto della variabile e non il nome del valore collegato nella tabella + dei simboli). + </simpara> + </sect1> + + <sect1 id="language.references.pass"> + <title>Passaggio per riferimento</title> + <para> + Si può passare una variabile ad una funzione per riferimento, modificandone gli argomenti. + La sintassi è la seguente: + <informalexample> + <programlisting role="php"> +<![CDATA[ +function foo(&$var) +{ + $var++; +} + +$a=5; +foo($a); +// $a adesso è 6 +]]> + </programlisting> + </informalexample> + Nota che non si usa il segno di riferimento nella chiamata della funzione, ma solo + nella definizione. La definizione della funzione basta da sola + per passare correttamente un argomento per riferimento. + </para> + <para> + Le seguenti cose possono essere passate per riferimento: + <itemizedlist> + <listitem> + <simpara> + Variabili, es. <literal>foo($a)</literal> + </simpara> + </listitem> + <listitem> + <simpara> + Operatore New, es. <literal>foo(new foobar())</literal> + </simpara> + </listitem> + <listitem> + <para> + Riferimento restituito da una funazione, es. + <informalexample> + <programlisting role="php"> +<![CDATA[ +function &bar() +{ + $a = 5; + return $a; +} +foo(bar()); +]]> + </programlisting> + </informalexample> + Vedi anche le spiegazioni sulla <link + linkend="language.references.return">restituzione per riferimento</link>. + </para> + </listitem> + </itemizedlist> + </para> + <para> + Qualunque altra cosa non dovrebbe essere passata per riferimento, poichè + il risultato sarebbe indefinito. Per esempio, il seguente passaggio + per riferimento non è valido: + <informalexample> + <programlisting role="php"> +<![CDATA[ +function bar() // Nota l'assenza di & +{ + $a = 5; + return $a; +} + +foo(bar()); +foo($a = 5) // Expressione: non una variabile +foo(5) // Constante: non una variabile +]]> + </programlisting> + </informalexample> + Questi requisiti sono validi per PHP 4.0.4 e seguenti. + </para> + </sect1> + + <sect1 id="language.references.return"> + <title>Restituzione per riferimento</title> + <para> + La restituzione per riferimento è utile quando si vuole usare una funzione + per trovare quale variabile un riferimento dovrebbe limitare. Per + restituire per riferimento, si usa questa sintassi: + <informalexample> + <programlisting role="php"> +<![CDATA[ +function &find_var($param) +{ + ...codice... + return $found_var; +} + +$foo =& find_var($bar); +$foo->x = 2; +]]> + </programlisting> + </informalexample> + In questo esempio, la proprietà dell'oggetto restituito dalla funzione + <varname>find_var</varname> viene impostata, non la + copia, come sarebbe stato senza l'uso della sintassi del riferimento. + </para> + <note> + <simpara> + Diversamente dal passaggio di un parametro, bisogna utilizzare + <literal>&amp;</literal> in entrambi i posti - nella dichiarazione per indicare che + si vuole restituire per riferimento, e non per copia come di consueto, + e per indicare nella chiamata, il collegamento del riferimento, piuttosto che l'usuale + assegnazione che verrebbe fatta per <varname>$foo</varname>. + </simpara> + </note> + </sect1> + + <sect1 id="language.references.unset"> + <title>Cancellare riferimenti</title> + <para> + Quando si cancella un riferimento, si rompe il collegamento tra il + nome della variabile e il contenuto della variabile. Questo non significa + che il contenuto della variabile venga distrutto. Per esempio: + <informalexample> + <programlisting role="php"> +<![CDATA[ +$a = 1; +$b =& $a; +unset ($a); +]]> + </programlisting> + </informalexample> + non cancella <varname>$b</varname>, ma solo <varname>$a</varname>. + </para> + <simpara> + Di nuovo, può essere utile pensare a questo con un'analogia col comendo Unix + <command>unlink</command>. + </simpara> + </sect1> + + <sect1 id="language.references.spot"> + <title>Spotting References</title> + <simpara> + Diversi costrutti in PHP sono implementati attraverso il meccanismo dei + riferimenti, dove ogni cosa detta precedentemente, si applica anche a + questi costrutti. Alcuni, come il passaggio e la + restituzione per riferimento, sono stati menzionati sopra, gli + altri sono: + </simpara> + + <sect2 id="references.global"> + <title>Il riferimento <literal>global</literal></title> + <para> + Quando si dichiara una variabile come <command>global $var</command> di fatto + si crea un riferimento ad una variabile globale. Questo ha lo stesso significato, + dell'espressione: + <informalexample> + <programlisting role="php"> +<![CDATA[ +$var =& $GLOBALS["var"]; +]]> + </programlisting> + </informalexample> + </para> + <simpara> + Questo significa, per esempio, che cancellando <varname>$var</varname> + non si cancella la variabile globale. + </simpara> + </sect2> + + <sect2 id="references.this"> + <title><literal>$this</literal></title> + <simpara> + In un metodo di un oggetto, <varname>$this</varname> è sempre un riferimento + all'oggetto chiamante. + </simpara> + </sect2> + </sect1> + + </chapter> + +<!-- Keep this comment at the end of the file +Local variables: +mode: sgml +sgml-omittag:t +sgml-shorttag:t +sgml-minimize-attributes:nil +sgml-always-quote-attributes:t +sgml-indent-step:1 +sgml-indent-data:t +indent-tabs-mode:nil +sgml-parent-document:nil +sgml-default-dtd-file:"../../manual.ced" +sgml-exposed-tags:nil +sgml-local-catalogs:nil +sgml-local-ecat-files:nil +End: +vim600: syn=xml fen fdm=syntax fdl=2 si +vim: et tw=78 syn=sgml +vi: ts=1 sw=1 +-->
« previous php.doc.it (#724) next »