1
0
mirror of https://github.com/php/doc-it.git synced 2026-04-28 09:43:20 +02:00
Files
2021-07-16 11:32:05 +02:00

378 lines
13 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 5a945dfef09a9595c83855cdb858ffa4a96af305 Maintainer: pastore Status: ready -->
<!-- CREDITS: cortesi -->
<chapter xml:id="language.constants" xmlns="http://docbook.org/ns/docbook">
<title>Costanti</title>
<simpara>
Una costante è un identificatore (nome) per un valore. Come si può intuire,
tale valore non può cambiare durante l'esecuzione dello
script (fanno eccezione le <link linkend="language.constants.magic">
costanti magiche</link>, che, in realtà, non sono costanti).
Le costanti sono "case-sensitive". È convenzione comune che gli identificatori
delle costanti siano sempre maiuscoli.
</simpara>
<note>
<para>
Prima di PHP 8.0.0, le costanti definite utilizzando la funzione
<function>define</function> possono non fare distinzione tra maiuscole e minuscole.
</para>
</note>
<para>
In PHP il nome di una costante segue le regole di qualsiasi "etichetta".
Un nome di costante valido inizia con una lettera o underscore, seguita
da un numero qualsiasi di caratteri alfanumerici o underscore.
L'espressione regolare che esprime questa convenzione è:
<code>^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$</code>
</para>
<para>
È possibile eseguire la funzione <function>define</function> per definire costanti con nomi riservati o addirittura
non validi, il cui valore può essere recuperato solo con la
funzione <function>constant</function>. Tuttavia, non è consigliabile farlo.
</para>
&tip.userlandnaming;
<para>
<!-- TODO Move into syntax section? -->
<example>
<title>Nomi di costanti validi ed errati</title>
<programlisting role="php">
<![CDATA[
<?php
// Nomi validi
define("FOO", "something");
define("FOO2", "something else");
define("FOO_BAR", "something more")
// Nomi di costante errati
define("2FOO", "something");
// Nomi validi, ma da evitare:
// un domani potrebbero essere utilizzati dal PHP per fornire costanti magiche
// e quindi si avrebbero problemi nello script
define("__FOO__", "something");
?>
]]>
</programlisting>
</example>
</para>
<note>
<simpara>
In questo contesto una lettera è a-z, A-Z e i caratteri ASCII
dal 128 al 255 (0x80-0xff).
</simpara>
</note>
<simpara>
Come le &link.superglobals;, costante è sempre globale.
Si può accedere alle costanti da qualsiasi punto dello script senza tenere conto della visibilità.
Per maggiori dettagli sulla visibilità, leggere la sezione
<link linkend="language.variables.scope">scope della variable</link>.
</simpara>
<note>
<simpara>
A partire da PHP 7.1.0, le costanti di classe possono dichiarare una visibilità protetta
o privata, rendendole disponibili solo nello scope gerarchico della
classe in cui è definita.
</simpara>
</note>
<sect1 xml:id="language.constants.syntax">
<title>Sintassi</title>
<simpara>
Le costanti possono essere definite utilizzando la parola chiave <literal>const</literal>
o utilizzando la funzione <function>define</function>.
Mentre <function>define</function> permette di definire
una costante in un'espressione arbitraria, la parola chiave <literal>const</literal> ha
delle restrizioni come descritto nel paragrafo successivo.
Una volta definita, una costante non può mai essere
modificata o non definita.
</simpara>
<simpara>
Quando si utilizza la parola chiave <literal>const</literal>,
sono accettate solo espressioni scalari (<type>bool</type>,
<type>int</type>, <type>float</type> e <type>string</type>) e
<type>array</type> costanti contenenti solo espressioni scalari.
È possibile definire costanti come una <type>resource</type>,
ma questo dovrebbe essere evitato, poiché può causare risultati inaspettati.
</simpara>
<simpara>
Si accede al valore di una costante semplicemente specificandone il nome.
A differenza delle variabili, una costante <emphasis>non</emphasis> è preceduta
da un <literal>$</literal>.
È anche possibile utilizzare la funzione <function>costant</function> per
leggere il valore di una costante se il nome della costante è ottenuto dinamicamente.
Si utilizzi <function>get_defined_constants</function> per ottenere una lista
di tutte le costanti definite.
</simpara>
<note>
<simpara>
Costanti e variabili (globali) si trovano in un "namespace" differente.
Questo implica che generalmente &true; e
<varname>$TRUE</varname> sono differenti.
</simpara>
</note>
<simpara>
Se si utilizza una costante non definita, viene generato un <classname>Error</classname>.
Prima di PHP 8.0.0, le costanti non definite venivano interpretate come una semplice
parola <type>string</type>, ovvero (COSTANTE vs "COSTANTE").
Questo fallback è deprecato a partire da PHP 7.2.0, e quando si verifica
viene emesso un errore di livello <constant>E_WARNING</constant>.
Prima di PHP 7.2.0, è stato invece emesso un
errore di livello <link linkend="ref.errorfunc">E_NOTICE</link>.
Si veda anche la voce del manuale sul perché
<link linkend="language.types.array.foo-bar">$foo[bar]</link> è
sbagliato (a meno che <literal>bar</literal> sia una costante).
Questo non si applica alle <link
linkend="language.namespaces.rules">costanti qualificate (completamente)</link>,
che genereranno sempre un <classname>Error</classname> se non definite.
</simpara>
<note>
<simpara>
Per verificare che una costante sia impostata, utilizzare la funzione <function>defined</function>.
</simpara>
</note>
<para>
Di seguito sono riportate le principali differenze rispetto le variabili:
<itemizedlist>
<listitem>
<simpara>
Le costanti non iniziano con il segno del dollaro
(<literal>$</literal>);
</simpara>
</listitem>
<listitem>
<simpara>
Le costanti possono essere definite e utilizzate ovunque
senza seguire le regole di visibilità;
</simpara>
</listitem>
<listitem>
<simpara>
Una volta impostate, le costanti non posso essere redefinite
e né annullate;
</simpara>
</listitem>
<listitem>
<simpara>
Le costanti possono essere valutate solo come valori scalari o array.
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
<example>
<title>Definizione di costanti</title>
<programlisting>
<![CDATA[
<?php
define("COSTANTE", "Ciao mondo.");
echo COSTANTE; // stampa "Ciao mondo."
echo Costante; // Emette un errore: Undefined constant "Constant"
// Prima di PHP 8.0.0, stampa "Constant" ed emette un avviso.
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>Definizione di Costanti utilizzando la parola chiave <literal>const</literal></title>
<programlisting role="php">
<![CDATA[
<?php
// Valore scalare semplice
const CONSTANT = 'Hello World';
echo CONSTANT;
// Espressione scalare
const ANOTHER_CONST = CONSTANT.'; Goodbye World';
echo ANOTHER_CONST;
const ANIMALS = array('dog', 'cat', 'bird');
echo ANIMALS[1]; // visualizza "cat"
// Array costanti
define('ANIMALS', array(
'dog',
'cat',
'bird'
));
echo ANIMALS[1]; // visualizza "cat"
?>
]]>
</programlisting>
</example>
</para>
<note>
<para>
Al contrario di definire costanti utilizzando <function>define</function>,
le costanti definite utilizzando la parola chiave <literal>const</literal> devono essere
dichiarate nella scope del livello superiore perchè sono definite in fase di compilazione.
Questo significa che non possono essere dichiarate all'interno di funzioni, cicli,
istruzioni <literal>if</literal> oppure blocchi
<literal>try</literal>/ <literal>catch</literal>.
</para>
</note>
<sect2 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><link linkend="language.oop5.constants">Costanti di Classe</link></member>
</simplelist>
</para>
</sect2>
</sect1>
<sect1 xml:id="language.constants.predefined">
<title>Costanti predefinite</title>
<simpara>
PHP fornisce un grande numero di <link
linkend="reserved.constants">costanti predefinite</link> per qualsiasi script
che viene eseguito. Molte di queste costanti, comunque, sono create da
varie estensioni, e saranno presenti solo quando queste estensioni
sono disponibili, sia perchè vengono caricate dinamicamente e sia perchè
sono state compilati in PHP.
</simpara>
</sect1>
<sect1 xml:id="language.constants.magic">
<title>Costanti magiche</title>
<para>
Ci sono nove costanti magiche che cambiano in base a
dove vengono utilizzate. Per esempio, il valore di
<constant>__LINE__</constant> dipende dalla linea che sta
utilizzando nel tuo script. Tutte queste costanti "magiche" vengono risolte
in fase di compilazione, a differenza delle costanti regolari, che vengono risolte in fase di esecuzione.
Queste costanti speciali non fanno distinzione tra maiuscole e minuscole e sono le seguenti:
</para>
<para>
<table>
<title>Costanti magiche di PHP</title>
<tgroup cols="2">
<thead>
<row>
<entry>&Name;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row xml:id="constant.line">
<entry><constant>__LINE__</constant></entry>
<entry>
Il numero della riga corrente del file.
</entry>
</row>
<row xml:id="constant.file">
<entry><constant>__FILE__</constant></entry>
<entry>
Il percorso completo e il nome del file con i link simbolici risolti. Se utilizzato all'interno di un'inclusione,
viene restituito il nome del file incluso.
</entry>
</row>
<row xml:id="constant.dir">
<entry><constant>__DIR__</constant></entry>
<entry>
La cartella del file. Se utilizzato all'interno di un'inclusione,
viene restituita la cartella del file incluso. Questo è equivalente
a <literal>dirname(__FILE__)</literal>. Il nome della cartella
non ha slash a meno che non sia la directory root.
</entry>
</row>
<row xml:id="constant.function">
<entry><constant>__FUNCTION__</constant></entry>
<entry>
Il nome della funzione, o <literal>{closure}</literal> per le funzioni anonime.
</entry>
</row>
<row xml:id="constant.class">
<entry><constant>__CLASS__</constant></entry>
<entry>
Il nome della classe. Il nome della classe include il namespace
in cui è stata dichiarata (es. <literal>Foo\Bar</literal>).
Quando usata
in un metodo trait, __CLASS__ è il nome della classe in cui il trait
è usato.
</entry>
</row>
<row xml:id="constant.trait">
<entry><constant>__TRAIT__</constant></entry>
<entry>
Il nome del trait. Il nome del trait include il namespace
in cui è stato dichiarato (es. <literal>Foo\Bar</literal>).
</entry>
</row>
<row xml:id="constant.method">
<entry><constant>__METHOD__</constant></entry>
<entry>
Il nome del metodo della classe.
</entry>
</row>
<row xml:id="constant.namespace">
<entry><constant>__NAMESPACE__</constant></entry>
<entry>
Il nome del namespace corrente.
</entry>
</row>
<row xml:id="constant.coloncolonclass">
<entry><constant><replaceable>ClassName</replaceable>::class</constant></entry>
<entry>
Il nome completo della classe.
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<sect2 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><link linkend="language.oop5.basic.class.class">::class</link></member>
<member><function>get_class</function></member>
<member><function>get_object_vars</function></member>
<member><function>file_exists</function></member>
<member><function>function_exists</function></member>
</simplelist>
</para>
</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:"~/.phpdoc/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
-->