mirror of
https://github.com/php/doc-ru.git
synced 2026-03-29 03:02:11 +02:00
128 lines
4.9 KiB
XML
128 lines
4.9 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: ce3a2d381693ccbc10cc4a808c3eb853f3c85c9e Maintainer: irker Status: ready -->
|
||
<!-- Reviewed: no -->
|
||
<sect1 xml:id="language.oop5.autoload" xmlns="http://docbook.org/ns/docbook">
|
||
<title>Автоматическая загрузка классов</title>
|
||
<para>
|
||
Разработчики объектно-ориентированных приложений
|
||
договорились создавать по одному исходному PHP-файлу для каждого класса.
|
||
Главная неприятность — приходится в начале каждого скрипта
|
||
писать длинный список включений, по одному для каждого файла,
|
||
который требуется загрузить.
|
||
</para>
|
||
<para>
|
||
Функция <function>spl_autoload_register</function>
|
||
регистрирует нужное количество автозагрузчиков
|
||
для автоматической загрузки классов и интерфейсов,
|
||
которые пока не определили.
|
||
Регистрация автозагрузчиков даёт PHP последний шанс загрузить класс
|
||
или интерфейс, прежде чем скрипт завершит работу с ошибкой.
|
||
</para>
|
||
<para>
|
||
Все классоподобные конструкции получится загрузить автоматически таким же способом,
|
||
включая классы, интерфейсы, трейты и перечисления.
|
||
</para>
|
||
<caution>
|
||
<para>
|
||
До PHP 8.0.0 классы и интерфейсы загружали автоматически
|
||
функцией <function>__autoload</function>.
|
||
Однако это менее гибкая альтернатива функции
|
||
<function>spl_autoload_register</function>,
|
||
а функцию <function>__autoload</function> объявили устаревшей в PHP 7.2.0
|
||
и удалили в PHP 8.0.0.
|
||
</para>
|
||
</caution>
|
||
<note>
|
||
<para>
|
||
Функцию <function>spl_autoload_register</function> разрешается
|
||
вызывать больше одного раза, чтобы зарегистрировать больше одного автозагрузчика.
|
||
Если функция автозагрузки выбросит исключение,
|
||
оно прервёт процесс автозагрузки и не разрешит запускать следующие функции автозагрузки.
|
||
Поэтому выбрасывать исключения из функции автозагрузки настоятельно не рекомендуется.
|
||
</para>
|
||
</note>
|
||
<para>
|
||
<example>
|
||
<title>Пример автоматической загрузки</title>
|
||
<para>
|
||
В этом примере функция пытается загрузить класс <literal>MyClass1</literal>
|
||
из файла <filename>MyClass1.php</filename> и класс <literal>MyClass2</literal>
|
||
из файла <filename>MyClass2.php</filename>.
|
||
</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>Ещё один пример автоматической загрузки</title>
|
||
<para>
|
||
В этом примере функция пытается загрузить интерфейс <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>
|
||
</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
|
||
-->
|