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
|
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision: 299619 $ -->
<sect1 xml:id="language.oop5.autoload" xmlns="http://docbook.org/ns/docbook">
<title>Autoloading Classes</title>
<para>
Many developers writing object-oriented applications create
one PHP source file per-class definition. One of the biggest
annoyances is having to write a long list of needed includes
at the beginning of each script (one for each class).
</para>
<para>
In PHP 5, this is no longer necessary. You may define an
__autoload function which is automatically
called in case you are trying to use a class/interface which hasn't been
defined yet. By calling this function the scripting engine is given
a last chance to load the class before PHP fails with an error.
</para>
<note>
<para>
Prior to 5.3.0, exceptions thrown in the __autoload function could not be
caught in the <link linkend="language.exceptions">catch</link> block and
would result in a fatal error. From 5.3.0+ exceptions thrown in the
__autoload function can be caught in the <link linkend="language.exceptions">
catch</link> block, with 1 provision. If throwing a custom exception, then
the custom exception class must be available. The __autoload function may
be used recursively to autoload the custom exception class.
</para>
</note>
<note>
<para>
Autoloading is not available if using PHP in CLI
<link linkend="features.commandline">interactive mode</link>.
</para>
</note>
<note>
<para>
If the class name is used e.g. in <function>call_user_func</function> then
it can contain some dangerous characters such as <literal>../</literal>.
It is recommended to not use the user-input in such functions or at least
verify the input in <function>__autoload</function>.
</para>
</note>
<para>
<example>
<title>Autoload example</title>
<para>
This example attempts to load the classes <literal>MyClass1</literal>
and <literal>MyClass2</literal> from the files <filename>MyClass1.php</filename>
and <filename>MyClass2.php</filename> respectively.
</para>
<programlisting role="php">
<![CDATA[
<?php
function __autoload($class_name) {
require_once $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
]]>
</programlisting>
</example>
<example>
<title>Autoload other example</title>
<para>
This example attempts to load the interface <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>Autoloading with exception handling for 5.3.0+</title>
<para>
This example throws an exception and demonstrates the try/catch block.
</para>
<programlisting role="php">
<![CDATA[
<?php
function __autoload($name) {
echo "Want to load $name.\n";
throw new Exception("Unable to load $name.");
}
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Want to load NonLoadableClass.
Unable to load NonLoadableClass.
]]>
</screen>
</example>
<example>
<title>Autoloading with exception handling for 5.3.0+ - Missing custom exception</title>
<para>
This example throws an exception for a non-loadable, custom exception.
</para>
<programlisting role="php">
<![CDATA[
<?php
function __autoload($name) {
echo "Want to load $name.\n";
throw new MissingException("Unable to load $name.");
}
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Want to load NonLoadableClass.
Want to load 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
-->
|