Files
php-doc-ru/language/oop5/autoload.xml
Alexey Pyltsyn 6c54e437d1 Upd
git-svn-id: https://svn.php.net/repository/phpdoc/ru/trunk@346673 c90b9560-bf6c-de11-be94-00142212c4b1
2019-01-29 06:30:51 +00:00

201 lines
7.9 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 71b5a8fe9132b287da51b55290bce09d51512077 Maintainer: irker Status: ready -->
<!-- Reviewed: yes -->
<!-- $Revision$ -->
<sect1 xml:id="language.oop5.autoload" xmlns="http://docbook.org/ns/docbook">
<title>Автоматическая загрузка классов</title>
<para>
Большинство разработчиков объектно-ориентированных приложений
используют такое соглашение именования файлов, в котором
каждый класс хранится в отдельно созданном для него файле.
Одна из самых больших неприятностей -
необходимость писать в начале каждого скрипта
длинный список подгружаемых файлов (по одному для каждого класса).
</para>
<para>
В PHP 5 это делать необязательно. Функция <function>spl_autoload_register</function>
позволяет зарегистрировать необходимое количество автозагрузчиков для
автоматической загрузки классов и интерфейсов, если они в настоящее время не определены.
Регистрируя автозагрузчики, PHP получает последний шанс для интерпретатора загрузить класс
прежде, чем он закончит выполнение скрипта с ошибкой.
</para>
<tip>
<para>
В то время как функция <function>__autoload</function> также может быть
использована для автоматической загрузки классов и интерфейсов, следует
отдать предпочтение <function>spl_autoload_register</function>, потому, что
она предоставляет гораздо более гибкую альтернативу, позволяя
регистрировать необходимое количество автозагрузчиков, например,
для сторонних библиотек. По этой причине
использование <function>__autoload</function> не рекомендуется,
а c PHP 7.2.0 объявлено устаревшим.
</para>
</tip>
<note>
<para>
До версии PHP 5.3 исключения, выброшенные в функции <function>__autoload</function>,
не могли быть пойманы в блоке <link linkend="language.exceptions">catch</link>
и приводили к фатальной ошибке. Начиная с версии 5.3 стало возможным
их перехватывать, но при условии, если класс исключения будет доступен.
Функция <function>__autoload</function> также может использоваться рекурсивно
для автоматической загрузки пользовательских классов исключений.
</para>
</note>
<note>
<para>
Автоматическая загрузка недоступна при использовании PHP
в <link linkend="features.commandline">интерактивном режиме</link> командной строки.
</para>
</note>
<note>
<para>
Если имя класса используется, например, для вызова через <function>call_user_func</function>,
то оно может содержать некоторые опасные символы, такие как <literal>../</literal>.
Поэтому рекомендуется не использовать данные от пользователей в таких функциях или же,
по крайней мере, проверять значения в <function>__autoload</function>.
</para>
</note>
<para>
<example>
<title>Пример автоматической загрузки</title>
<para>
В этом примере функция пытается загрузить классы <literal>MyClass1</literal>
и <literal>MyClass2</literal> из файлов <filename>MyClass1.php</filename>
и <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>
<example>
<title>Автоматическая загрузка с перехватом исключения с версии 5.3.0+</title>
<para>
В данном примере вызывается исключение и отлавливается блоком try/catch.
</para>
<programlisting role="php">
<![CDATA[
<?php
spl_autoload_register(function ($name) {
echo "Хочу загрузить $name.\n";
throw new Exception("Невозможно загрузить $name.");
});
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Хочу загрузить NonLoadableClass.
Невозможно загрузить NonLoadableClass.
]]>
</screen>
</example>
<example>
<title>Автоматическая загрузка с перехватом исключения в версиях 5.3.0+ - Класс пользовательского исключения отсутствует</title>
<para>
В данном примере вызывается незагруженное пользовательское исключение.
</para>
<programlisting role="php">
<![CDATA[
<?php
spl_autoload_register(function ($name) {
echo "Хочу загрузить $name.\n";
throw new MissingException("Невозможно загрузить $name.");
});
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Хочу загрузить NonLoadableClass.
Хочу загрузить 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="ini.unserialize-callback-func">unserialize_callback_func</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
-->