Files
php-doc-ru/language/oop5/autoload.xml
Shein Alexey c84e5cedac Updated translation.
git-svn-id: https://svn.php.net/repository/phpdoc/ru/trunk@316321 c90b9560-bf6c-de11-be94-00142212c4b1
2011-09-07 10:30:11 +00:00

199 lines
7.3 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: 7137ccc0fdbf158b97872772dd6a989f32f50365 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 это делать не обязательно.
Можно определить функцию __autoload, которая будет автоматически
вызвана при использовании ранее неопределенного класса или
интерфейса. Вызов этой функции - последний шанс для
интерпретатора загрузить класс прежде, чем он закончит
выполнение скрипта с ошибкой.
</para>
<tip>
<para>
<function>spl_autoload_register</function> предоставляет более
гибкую альтернативу для автоматической загрузки классов.
По этой причине использовать <function>__autoload</function>
не рекомендуется, а сама функция в будущем может перестать
поддерживаться или быть удалена.
</para>
</tip>
<note>
<para>
До версии 5.3.0, исключения, вызванные в функции __autoload, не могли быть
перехвачены в блоке <link linkend="language.exceptions">catch</link>
и завершались с неисправимой ошибкой. Начиная с версии 5.3.0 эти исключения
можно перехватывать в ближайшем блоке <link linkend="language.exceptions">catch</link>.
Если бросить определенное пользователем исключение, то класс этого
исключения должен быть доступен. Функция __autoload также может использоваться
рекурсивно для автоматической загрузки пользовательских классов исключений.
</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
function __autoload($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
function __autoload($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
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>Автоматическая загрузка с перехватом исключения в версиях 5.3.0+ - Класс пользовательского исключения не подгружен</title>
<para>
В данном примере вызывается недоступное исключение.
</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
-->