Все ленты — последние статьи

Автоматическая загрузка классов в PHP

При разработке приложений на PHP распространенной практикой является создание одного файла на один класс. В результате может получиться весьма внушительный список включений вначале каждого скрипта.

Но с появлением PHP 5 такой список можно элегантно заменить, определив функцию __autoload, которая будет автоматически вызываться в случае использования класса/интерфейса, который еще не определён.

 

Вот пример. Создадим два класса. Первый будет размещаться в файле Image.php и иметь код:
1 <?php
2 class Image {
3
4 function __construct() {
5 echo 'Класс Image успешно загружен.<br />';
6 }
7
8 }
9 ?>

Второй класс будет размещаться в файле Test.php:
1 <?php
2 class Test {
3
4 function __construct() {
5 echo 'Класс Test работает.<br />';
6 }
7
8 }
9 ?>

Для примера мы создали два простых класса с конструкторами, которые выводят сообщения. Теперь создадим файл index.php, в котором будем использовать оба класса:
1 <?php
2 function __autoload($class_name) {
3 require_once $class_name . '.php';
4 }
5
6 $a = new Test();
7 $b = new Image();
8 ?>

Когда запускается index.php в браузере, все отлично работает (все три файла должны находиться в одной папке). Конечно, на двух классах преимущества такой записи не видно. Но представьте, что проект содержит 10 и более классов, и что надо в каждом файле писать require_once много раз.

Кроме того, можно воспользоваться исключениями в PHP 5.3 и выше. Изменим index.php следующим образом:
01 <?php
02 function __autoload($class_name) {
03 if(file_exists($class_name . '.php')) {
04 require_once($class_name . '.php');
05 } else {
06 throw new Exception("Недоступен файл для класса $class_name.");
07 }
08 }
09
10 try {
11 $a = new Test();
12 $b = new Image();
13 } catch (Exception $e) {
14 echo $e->getMessage(), "n";
15 }
16 ?>

Теперь наш код еще и проверяет наличие файлов и выдает соответствующее предупреждение.