При разработке приложений на PHP распространенной практикой является создание одного файла на один класс. В результате может получиться весьма внушительный список включений вначале каждого скрипта.
Но с появлением PHP 5 такой список можно элегантно заменить, определив функцию __autoload, которая будет автоматически вызываться в случае использования класса/интерфейса, который еще не определён.
Вот пример. Создадим два класса. Первый будет размещаться в файле Image.php и иметь код:
<?php
class Image {
function __construct() {
echo 'Класс Image успешно загружен.<br />';
}
}
?>
Второй класс будет размещаться в файле Test.php:
<?php
class Test {
function __construct() {
echo 'Класс Test работает.<br />';
}
}
?>
Для примера мы создали два простых класса с конструкторами, которые выводят сообщения. Теперь создадим файл index.php, в котором будем использовать оба класса:
<?php
function __autoload($class_name) {
require_once $class_name . '.php';
}
$a = new Test();
$b = new Image();
?>
Когда запускается index.php в браузере, все отлично работает (все три файла должны находиться в одной папке). Конечно, на двух классах преимущества такой записи не видно. Но представьте, что проект содержит 10 и более классов, и что надо в каждом файле писать require_once много раз.
Кроме того, можно воспользоваться исключениями в PHP 5.3 и выше. Изменим index.php следующим образом:
<?php
function __autoload($class_name) {
if(file_exists($class_name . '.php')) {
require_once($class_name . '.php');
} else {
throw new Exception("Недоступен файл для класса $class_name.");
}
}
try {
$a = new Test();
$b = new Image();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
Теперь наш код еще и проверяет наличие файлов и выдает соответствующее предупреждение.