AAA Главная
Примеры PHP Примеры JavaScript Примеры Ajax Примеры CSS,HTML

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

В этой статье я хочу рассказать, как избавиться от include-ов файлов с PHP-классами и сделать их подгрузку полностью автоматической.

Этот метод актуален только для объектно-ориентированного стиля программирования, и будет работать в версии PHP 5.1.2 и выше.

Давайте рассмотрим пример. Имеем два файла:

Файл example.php:

class example {
  static function call() {
    echo 'You call "' . __CLASS__ . '" class.';
  }
}

Файл index.php:

include 'example.php';
example::call();

Оба файла находятся в одной директории. В первом файле example.php объявлен класс example. Во втором файле мы подключаем example.php и вызываем метод call класса example. Метод call является статическим, поэтому нам не обязательно создавать экземпляр класса example для его вызова.

Результатом выполнения этого скрипта будет сообщение «You call "example" class.»

Для использования класса example, нам нужно было подгрузить соответствующий файл — example.php.

А теперь представьте, что классов у вас сотни, и вам нужно вручную каждый раз прописывать инклуды файлов с классами, чтобы все их использовать.

Давайте поступим проще! Напишем функцию, которая будет автоматически подгружать нужный нам файл с классом только тогда, когда мы начинаем использовать этот класс. То есть, если класс в ходе выполнения сценария не используется, то и подключать с ним файл нет необходимости.

Модифицируем предыдущий пример:

Файл autoload.php:

spl_autoload_register ('autoload');
function autoload ($className) {
  $fileName = $className . '.php';
  include  $fileName;
  }

Файл example.php:

class example {
  static  function call() {
  echo  'You call "' . __CLASS__ . '" class.';
  }
}

Файл index.php:

include 'autoload.php';
example::call();

Мы добавили новый файл autoload.php и подгрузили его в index.php. Обратите внимание — мы все также вызываем example::call(), и вместо «Fatal error: Class "example" not found in …» получаем прежний результат — «You call "example" class.». Даже без ручной подгрузки файла example.php, класс example нашелся и его метод вызвался. Как так получилось?

PHP позволяет задать обработчик (функцию или метод класса) который будет вызываться всякий раз при обращении к классу, который еще не определен. Аргументом функции-обработчика является имя вызываемого класса. Обработчик мы определяем с помощью функции spl_autoload_register(). Если в качестве обработчика выступает функция, то аргументом spl_autoload_register() будет являться строка с именем функции (как в примере). Если же в качестве обработчика выступает метод класса, то аргументом spl_autoload_register() будет являться массив, первый элемент которого соответствует названию класса, а второй названию метода этого класса — spl_autoload_register(array('someoneClass', 'someoneMethod')). Метод-обработчик должен быть статическим.

В нашем примере, в качестве обработчика я использовал функцию autoload(). К имени вызываемого класса она добавляет расширение «.php» и пытается подгрузить файл <class>.php, где <class> — имя вызываемого класса.

Мы привели простой пример, чтобы вы поняли, как работает метод автоматической подгрузки файлов с классами, в следующий раз покажем реальное применение, где это может использоваться.

Только не стоит забывать, что такой способ более медленный чем привычный include (особенно когда автолоад будет не таким простым), и значит его не стоит использовать при разработки ядра CMS либо CMF, а вот при разработке конкретного приложения вполне сгодится…

http://www.codeisart.ru/php-class-files-autoload


.

© Copyright 2008-2016 by KDG