AGAVA partners programs http://agava.ru/partners/            

Название функции

             
Веб-курсы


Что это?

Оглавление

Основы
Основы основ

Практика
Гостевая книга
Простой сайт
Структура сайта (MVC)
Ядро (Light)
Ядро
Гостевая на SQL
Статические страницы
Модуль новостей
Система регистрации

Теория
Дебаггинг
Регулярные выражения
Введение в ООП
Паттерны проектирования

Репозитарий
BB-code
Почтовый класс
Пагинатор
Всякие полезности

Download
Полезные утилиты

Разное
Видеокурсы
Последние изменения
Вопросы и замечания сюда



Реклама

Диеты для похудения
Фреймворк Kohana. Обучение. Мануал на русском.







Автолоад

Вот интересная ситуация. ООП многими поборниками позиционируется как вещь, призванная упорядочить код и сделать его более компактным. Однако что вышло. В процедурном подходе файл с нужным функционалом было достаточно подключить.
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();
Хотя для чего она - мне не ясно. Разработчик, вызывая какой то класс в скрипте, обязан знать - есть ли он у него. А лишняя проверка никакой пользы не несет.

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

Впрочем решать Вам, наше дело показать принцип.
Рейтинг@Mail.ru Рейтинг@Mail.ru Яндекс цитирования
irbis-team © 2009