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

При разработке приложений на 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";
}
?>

Теперь наш код еще и проверяет наличие файлов и выдает соответствующее предупреждение.
Теги:
Автоматическая загрузка, класс, __autoload
Добавлено: 16 Мая 2018 16:54:15 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...