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
|
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<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>
The <function>spl_autoload_register</function> function registers any number of
autoloaders, enabling for classes and interfaces to be automatically loaded
if they are currently not defined. By registering autoloaders, PHP is given
a last chance to load the class or interface before it fails with an error.
</para>
<para>
Any class-like construct may be autoloaded the same way. That includes classes,
interfaces, traits, and enumerations.
</para>
<caution>
<para>
Prior to PHP 8.0.0, it was possible to use <function>__autoload</function>
to autoload classes and interfaces. However, it is a less flexible
alternative to <function>spl_autoload_register</function> and
<function>__autoload</function> is deprecated as of PHP 7.2.0, and removed
as of PHP 8.0.0.
</para>
</caution>
<note>
<para>
<function>spl_autoload_register</function> may be called multiple times in order
to register multiple autoloaders. Throwing an exception from an autoload function,
however, will interrupt that process and not allow further autoload functions to
run. For that reason, throwing exceptions from an autoload function is strongly
discouraged.
</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
spl_autoload_register(function ($class_name) {
include $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
spl_autoload_register(function ($name) {
var_dump($name);
});
class Foo implements ITest {
}
/*
string(5) "ITest"
Fatal error: Interface 'ITest' not found in ...
*/
?>
]]>
</programlisting>
</example>
<example>
<title>Using Composer's autoloader</title>
<simpara>
&link.composer; generates a <literal>vendor/autoload.php</literal>
which is set up to automatically load packages that are being managed
by Composer. By including this file, those packages can be used without
any additional work.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
require __DIR__ . '/vendor/autoload.php';
$uuid = new Ramsey\Uuid\Uuid::uuid7();
echo "Generated new UUID -> ", $uuid->toString(), "\n";
?>
]]>
</programlisting>
</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
-->
|