2011-02-01 3 views
-1

Существует несколько устаревших PHP код, который я получил, что определил такую ​​функцию (иАвтозагрузка классов в php - это хорошая практика?

function __autoload($class_name) 
{ 
    $filename=CLASSES. strtolower($class_name) . '_class.php'; 
    if (file_exists($filename)) 
    { 
     require_once $filename; 
    } 
} 

где КЛАССЫ это путь, по которому эти специфические (имя_класса) _class.php файлы находятся.

выше функция находится в файле, который включен везде

это приемлемая практика -.?. либо ошибки при использовании его как это

ответ

1

Функция автозагрузки загружает файл, если определение класса неизвестно. Поэтому, как @ fran-Verona и @ Andy-Paton, где вы боитесь, вам не нужно беспокоиться, что вы автоматически загружаете все свои классы.

Вы загружаете функцию во весь ваш код, но вы будете загружать «verylittleusedclass.class.php» только тогда, когда он вызывается (например, new VeryLittleUsedClass() или через статический вызов VeryLittleUsedClass::theFunction()).

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

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

+0

Точно, я собирался написать это. '__autoload()' не загружает все ваши классы, а только тот, который используется в текущем скрипте. Это очень хорошая практика * почти всегда *, используемая каркасами. – Shikiryu

+0

Спасибо Nanne, Shikiryu за отзыв! – Steve

2

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

1

Я рекомендую использовать этот автозагрузчик https://gist.github.com/169617 (также называемый в PEAR стиль автозагрузчика)

Он работает с этой конвенцией

Имя класса: Core_DB_Mysql путь к файл: Ядро/DB/Mysql

Вы можете группируйте свои классы;

 
Core/Cache 
    Core/Cache/APC 
    Core/Cache/Memcache 

Core/Models 
    Core/Models/User 
    Core/Models/Post 

Хорошо с этой конвенцией вам не нужно снова и снова

1

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

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

Таким образом, вы должны включать в себя все из них вручную очень близко к верхней части index.php (или любой другой файл сначала запущен браузер) с использованием включают $ file1.php включают $ file2.php и т.д. ....

Это даст вам лучшую производительность и эти классы гарантированно кэшируются APC (если вы используете APC кэш причины)

Теперь внутри ваших классов вы можете иметь некоторую логику, которая условно использует один или другие класса, в зависимости от ситуации

Например

если (Request :: isAjax()) { AjaxResponder :: SendResponse(); } else { return $ page; }

Теперь это нормально, если автозагрузчик загружает класс AjaxResponder, поскольку он может даже не понадобиться.

Таким образом, если класс может не понадобиться, пусть автозагрузчик обработает его, в противном случае включите его вручную.

Это очень простое правило.

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

Если вы используете spl_autoload_register, помните, что следите за порядком зарегистрированных функций автозагрузки. Приказ, если это важно.

Хороший пример смарт-класса автопогрузчика здесь

http://groups.google.com/group/php-standards/web/psr-0-final-proposal

Обратите внимание, что она не использует какие-либо проверки, чтобы увидеть, если (file_exists()) или что-нибудь подобное. Он просто использует команду require() и полагается на функцию require, чтобы поднять ошибку, если файл не найден.

Никогда не используйте include_once() или require_once внутри автозагрузчика. Это не имеет смысла, поскольку автозагрузчик не будет вызываться в классе уже включен, но require_once и include_once все равно придется выполнить дополнительную проверку, чтобы увидеть, включен ли файл.

Смежные вопросы