-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathautoload.xml
193 lines (182 loc) · 5.75 KB
/
autoload.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 5b5ab43c78ecf2d9b8c678569afceff8b5e79c5f Maintainer: pastore Status: ready -->
<!-- CREDITS: khelaz -->
<sect1 xml:id="language.oop5.autoload" xmlns="http://docbook.org/ns/docbook">
<title>Caricamento automatico delle classi</title>
<para>
Molti sviluppatori che producono applicazioni orientate agli oggetti creano
un file sorgente PHP per ogni classe definita. Uno dei più grossi inconvenienti
di questo approccio è la necessità di mantenere una lunga lista di
inclusioni all'inizio di ogni script (un'inclusione per ogni classe).
</para>
<para>
In PHP 5, ciò non è più necessario, in quanto è possibile definire una funzione
<function>__autoload</function> che viene automaticamente
invocata in caso si stia cercando di usare una classe/interfaccia che non sia stata
ancora definita. Chiamando questa funzione, il motore di scripting ha una ultima
possibilità di caricare la classe prima che PHP termini l'esecuzione con un errore.
</para>
<tip>
<para>
La funzione <function>spl_autoload_register</function> fornisce una alternative più flessibile
per l'autocaricamento delle classi. Per questa ragione, usare
la funzione <function>__autoload</function> è sconsigliato dato che in futuro potrà essere
rimossa o diventare deprecata.
</para>
</tip>
<note>
<para>
Prima di 5.3.0, le eccezioni sollevate dalla funzione __autoload non potevano essere
intercettate nel blocco <link linkend="language.exceptions">catch</link> e
avrebbero portato ad un errore fatale. Da 5.3.0+ le eccezioni sollevate nella
funzione __autoload possono essere intercettate nel blocco <link linkend="language.exceptions">
catch</link>, con la sola precisazione che se si sta sollevando un'eccezione definita dall'utente
la classe in cui l'eccezione viene definita deve essere disponibile. La funzione __autoload può
essere usata ricorsivamente per caricare la classe dell'eccezione personalizzata.
</para>
</note>
<note>
<para>
La funzionalità di autocaricamento non è disponibile se si sta usando PHP nella
<link linkend="features.commandline">modalità interattiva</link> di CLI.
</para>
</note>
<note>
<para>
Se il nome di classe è usato ad esempio in <function>call_user_func</function> esso
può contenere alcuni caratteri pericolosi come <literal>../</literal>.
Si raccomanda di non usare direttamente valori inputati dall'utente in tali funzioni, o quanto meno di
verificare l'input <function>__autoload</function>.
</para>
</note>
<para>
<example>
<title>Esempio di autocaricamento</title>
<para>
Questo esempio cerca di caricare le classi <literal>MyClass1</literal>
e <literal>MyClass2</literal> rispettivamente dai file <filename>MyClass1.php</filename>
e <filename>MyClass2.php</filename>.
</para>
<programlisting role="php">
<![CDATA[
<?php
function __autoload($class_name) {
include $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
]]>
</programlisting>
</example>
<example>
<title>Altro esempio di autocaricamento</title>
<para>
Questo esempio tenta di caricare l'interfaccia <literal>ITest</literal>.
</para>
<programlisting role="php">
<![CDATA[
<?php
function __autoload($name) {
var_dump($name);
}
class Foo implements ITest {
}
/*
string(5) "ITest"
Fatal error: Interface 'ITest' not found in ...
*/
?>
]]>
</programlisting>
</example>
<example>
<title>Autocaricamento con gestione delle eccezioni per 5.3.0+</title>
<para>
Questo esempio solleva un'eccezione e dimostra come intercettarla con il blocco try/catch.
</para>
<programlisting role="php">
<![CDATA[
<?php
function __autoload($name) {
echo "Si vuole caricare $name.\n";
throw new Exception("Impossibile caricare $name.");
}
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Si vuole caricare NonLoadableClass.
Impossibile caricare NonLoadableClass.
]]>
</screen>
</example>
<example>
<title>Autocaricamento con gestione delle eccezioni per 5.3.0+ - Classe dell'eccezione personalizzata mancante</title>
<para>
Questo esempio solleva un'eccezione per una eccezione personalizzata non caricabile.
</para>
<programlisting role="php">
<![CDATA[
<?php
function __autoload($name) {
echo "Si vuole caricare $name.\n";
throw new MissingException("Impossibile $name.");
}
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Si vuole caricare NonLoadableClass.
Si vuole caricare MissingException.
Fatal error: Class 'MissingException' not found in testMissingException.php on line 4
]]>
</screen>
</example>
</para>
<simplesect role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>unserialize</function></member>
<member><link linkend="unserialize-callback-func">unserialize_callback_func</link></member>
<member><function>spl_autoload</function></member>
<member><function>spl_autoload_register</function></member>
</simplelist>
</para>
</simplesect>
</sect1>
<!-- 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
-->