-
Notifications
You must be signed in to change notification settings - Fork 58
/
Copy pathautoload.xml
199 lines (188 loc) · 5.86 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
194
195
196
197
198
199
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 71b5a8fe9132b287da51b55290bce09d51512077 Maintainer: seros Status: ready -->
<!-- Reviewed: no Maintainer: seros -->
<sect1 xml:id="language.oop5.autoload" xmlns="http://docbook.org/ns/docbook">
<title>Autocarga de clases</title>
<para>
Muchos desarrolladores que escriben aplicaciones orientadas a objetos
crean un fichero fuente de PHP para cada definición de clase. Una de las
mayores molestias es tener que hacer una larga lista de inclusiones
al comienzo de cada script (uno por cada clase).
</para>
<para>
En PHP 5 esto ya no es necesario. La
función <function>spl_autoload_register</function> registra cualquier número de
autocargadores, posibilitando que las clases e interfaces sean cargadas automáticamente
si no están definidas actualmente. Al registrar autocargadores, a PHP se le da
una última oportunidad de cargar las clases o interfaces antes de que falle por un error.
</para>
<tip>
<para>
Aunque la función <function>__autoload</function> también puede ser empleada para
autocargar clases e interfaces, es preferible utilizar la
función <function>spl_autoload_register</function>. Esto es debido a que es
una alternativa más flexible (posibilitando que se pueda especificar cualquier número
de autocargadores en la aplicación, tales como los de las bibliotecas de terceros). Por esta
razón, se desaconseja el uso de <function>__autoload</function> y es obsoleto
a partir de PHP 7.2.0.
</para>
</tip>
<note>
<para>
Antes de 5.3.0, las excepciones lanzadas en la función
<function>__autoload</function> no podían ser capturadas en el
bloque <link linkend="language.exceptions">catch</link>, resultando en
un error fatal. Desde 5.3 en adelante, esto es posible simpre que, si
se lanza una excepción personalizada, esté disponible la clase de la excepción personalizada.
La función <function>__autoload</function> podría utilizarse recursivamente para
cargar la clase de excepción personalizada.
</para>
</note>
<note>
<para>
La autocarga no está disponible si se utiliza PHP en el
<link linkend="features.commandline">modo interactivo</link> CLI.
</para>
</note>
<note>
<para>
Si el nombre de la clase se utiliza, por ejemplo, en <function>call_user_func</function>,
este puede contener algunos caracteres peligrosos tales como <literal>../</literal>.
Se recomienda no utilizar la entrada del usuario en tales funciones, o al menos
verificar dicha entrada en <function>__autoload</function>.
</para>
</note>
<para>
<example>
<title>Ejemplo de autocarga</title>
<para>
Este ejemplo intenta cargar las clases <literal>MiClase1</literal>
y <literal>MiClase2</literal> desde los ficheros <filename>MiClase1.php</filename>
y <filename>MiClase2.php</filename>, respectivamente.
</para>
<programlisting role="php">
<![CDATA[
<?php
spl_autoload_register(function ($nombre_clase) {
include $nombre_clase . '.php';
});
$obj = new MiClase1();
$obj2 = new MiClase2();
?>
]]>
</programlisting>
</example>
<example>
<title>Otro ejemplo de autocarga</title>
<para>
Este ejemplo intenta cargar la interfaz <literal>IPrueba</literal>.
</para>
<programlisting role="php">
<![CDATA[
<?php
spl_autoload_register(function ($nombre) {
var_dump($nombre);
});
class Foo implements IPrueba {
}
/*
string(7) "IPrueba"
Fatal error: Interface 'IPrueba' not found in ...
*/
?>
]]>
</programlisting>
</example>
<example>
<title>Autocarga con manejo de excepciones para 5.3.0+</title>
<para>
Este ejemplo lanza una excepción y demuestra los bloques try/catch.
</para>
<programlisting role="php">
<![CDATA[
<?php
spl_autoload_register(function ($nombre) {
echo "Intentando cargar $nombre.\n";
throw new Exception("Imposible cargar $nombre.");
});
try {
$obj = new ClaseNoCargable();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Intentando cargar ClaseNoCargable.
Imposible cargar ClaseNoCargable.
]]>
</screen>
</example>
<example>
<title>Autocarga con manejo de excepciones para 5.3.0+: Excepción personalizada ausente</title>
<para>
Este ejemplo lanza una excepción para una excepción personalizada no cargable.
</para>
<programlisting role="php">
<![CDATA[
<?php
spl_autoload_register(function ($nombre) {
echo "Intentando cargar $nombre.\n";
throw new ExcepciónAusente("Imposible cargar $nombre.");
});
try {
$obj = new ClaseNoCargable();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Intentando cargar ClaseNoCargable.
Intentando cargar ExcepciónAusente.
Fatal error: Class 'ExcepciónAusente' not found in testExcepcionAusente.php on line 4
]]>
</screen>
</example>
</para>
<simplesect role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>unserialize</function></member>
<member><link linkend="ini.unserialize-callback-func">unserialize_callback_func</link></member>
<member><link linkend="ini.unserialize-max-depth">unserialize_max_depth</link></member>
<member><function>spl_autoload_register</function></member>
<member><function>spl_autoload</function></member>
<member><function>__autoload</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
-->