В этой статье я хочу рассказать, как избавиться от include-ов файлов с PHP-классами и сделать их подгрузку полностью автоматической.
Этот метод актуален только для объектно-ориентированного стиля программирования, и будет работать в версии PHP 5.1.2 и выше.
Давайте рассмотрим пример. Имеем два файла:
Файл example.php:
<?php
class example {
static function call() {
echo 'You call "' . __CLASS__ . '" class.';
}
}
?>Скопировать в буфер
Файл index.php:
<?php
include 'example.php';
example::call();
?>Скопировать в буфер
Оба файла находятся в одной директории. В первом файле example.php объявлен класс example. Во втором файле мы подключаем example.php и вызываем метод call класса example. Метод call является статическим, поэтому нам не обязательно создавать экземпляр класса example для его вызова.
Результатом выполнения этого скрипта будет сообщение «You call "example" class.»
Для использования класса example, нам нужно было подгрузить соответствующий файл — example.php.
А теперь представьте, что классов у вас сотни, и вам нужно вручную каждый раз прописывать инклуды файлов с классами, чтобы все их использовать.
Давайте поступим проще! Напишем функцию, которая будет автоматически подгружать нужный нам файл с классом только тогда, когда мы начинаем использовать этот класс. То есть, если класс в ходе выполнения сценария не используется, то и подключать с ним файл нет необходимости.
Модифицируем предыдущий пример:
Файл autoload.php:
<?php
spl_autoload_register ('autoload');
function autoload ($className) {
$fileName = $className . '.php';
include $fileName;
}
?>Скопировать в буфер
Файл example.php:
<?php
class example {
static function call() {
echo 'You call "' . __CLASS__ . '" class.';
}
}
?>Скопировать в буфер
Файл index.php:
<?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-2012 by KDG