Рейтинг@Mail.ru
 
Автолоад

Вот интересная ситуация. ООП многими поборниками позиционируется как вещь, призванная упорядочить код и сделать его более компактным. Однако что вышло. В процедурном подходе файл с нужным функционалом было достаточно подключить.
1
2
3
4
<?php

   
include './functions.php';
В ООП плюс к этому еще нужно инициализировать объект:
1
2
3
4
5
<?php

   
include './exampleclass.php';
   
$obj = new exampleClass();


Декларация с уменьшением объема кода потерпела фиаско - строк больше ровно в два раза.

Чтобы восстановить утерянные позиции, была изобретена функция __autoload(). Вернее не сама функция, а способность PHP вызывать эту функцию, если он не может найти нужный класс. Вот сделаем теперь так:
1
2
3
4
5
6
7
8
9
<?php

    
function __autoload($classname)
    {
        echo 
$classname;    
    }

    
$obj = new exampleClass();


Если запустить этот код, мы получим ошибку интерпретатора "Class 'exampleClass' not found". И он прав - класс то мы не определяли.
Но если присмотреться, то перед ошибкой можно разглядеть название класса. Из чего можно сделать вывод, что функция __autoload() сработала. Хотя мы её и не запускали. Причем в её аргумент было передано название класса, объект которого мы пытались получить.

Вот можно воспользоваться этой возможностью и подгрузить файл с классом именно тогда, когда он понадобится. А именно при инициализации объекта:
1
2
3
4
5
6
7
8
9
<?php

    
function __autoload($classname)
    {
       include_once 
$classname .'.php';     
    }
    
    
$obj = new exampleClass();


Теперь просто нужно класс exampleClass поместить в одноименный файл exampleсlass.php, а функцию поместить туда, где к ней будет доступ из всех запускаемых скриптов. И теперь можно не писать двух строк, а просто инициализировать объект в нужном месте. Класс подгрузится сам.

Для пущей важности можно добавить проверку на наличие файла. Многие так и делают:
1
2
3
4
5
6
7
8
9
10
11
12
<?php

    
function __autoload($classname)
    {
       if(
file_exists($classname .'.php'))
           include_once 
$classname .'.php';
       else 
           exit(
'Class '$classname .' no found');    
    }
    
    
$obj = new exampleClass();
Хотя для чего она - мне не ясно. Разработчик, вызывая какой то класс в скрипте, обязан знать - есть ли он у него. А лишняя проверка никакой пользы не несет.

Многие идут еще дальше - делают реестр. Другими словами массив с именами классов. И проверяют наличие запускаемого в реестре. Тоже совершенно лишняя операция. Для того, чтобы знать, что где - достаточно документации и комментариев.

Впрочем решать Вам, наше дело показать принцип.