Я читал о динамичной загрузке Ваших файлов класса при необходимости в функции как это:
function __autoload($className)
{
include("classes/$className.class.php");
}
$obj = new DB();
Который автоматически загрузится DB.class.php
когда Вы делаете новый экземпляр того класса, но я также читал в нескольких статьях, что это плохо для использования этого, поскольку это - глобальная функция и любые библиотеки, которые Вы приводите в свой проект, которые имеют __autoload()
функция испортит его.
Кто-либо знает о решении? Возможно, другой способ достигнуть того же эффекта как __autoload()
? Пока я не найду подходящее решение, я только продолжу использовать __autoload()
поскольку это не начинает становиться проблемой, пока Вы не вводите библиотеки и такой.
Спасибо.
Я использовал следующий код для использования spl_autoload_register таким образом, что он будет ухудшаться, если его нет, а также для обработки библиотек, использующих __autoload, которые вам необходимо включить.
//check to see if there is an existing __autoload function from another library
if(!function_exists('__autoload')) {
if(function_exists('spl_autoload_register')) {
//we have SPL, so register the autoload function
spl_autoload_register('my_autoload_function');
} else {
//if there isn't, we don't need to worry about using the stack,
//we can just register our own autoloader
function __autoload($class_name) {
my_autoload_function($class_name);
}
}
} else {
//ok, so there is an existing __autoload function, we need to use a stack
//if SPL is installed, we can use spl_autoload_register,
//if there isn't, then we can't do anything about it, and
//will have to die
if(function_exists('spl_autoload_register')) {
//we have SPL, so register both the
//original __autoload from the external app,
//because the original will get overwritten by the stack,
//plus our own
spl_autoload_register('__autoload');
spl_autoload_register('my_autoload_function');
} else {
exit;
}
}
Итак, этот код проверит наличие существующей функции __autoload и добавит ее в стек вместе с вашей (потому что spl_autoload_register отключит нормальное поведение __autoload).
Вы можете использовать Zend_Loader . (Предполагая, что Zend Framework для вас доступен ...)
Вы можете использовать spl_autoload_register ()
, добавляя любую существующую магию __ autoload ()
в стек.
function my_autoload( $class ) {
include( $class . '.al.php' );
}
spl_autoload_register('my_autoload');
if( function_exists('__autoload') ) {
spl_autoload_register('__autoload');
}
$f = new Foo;
Правильным способом было бы использовать spl_autoload_register
. Чтобы сохранить функцию __ autoload
, которую представили некоторые сторонние производители, вы можете поместить эту функцию в стек автозагрузки а также:
if (function_exists('__autoload')) {
spl_autoload_register('__autoload');
}
Лучшее, что вы можете сделать, это определить свой собственный объект, отвечающий за автозагрузку для любой подсистемы, которую вы программируете.
Например:
class BasketAutoloader
{
static public function register()
{
spl_autoload_register(array(new self, 'autoload'));
}
public function autoload($class)
{
require dirname(__FILE__).'/'.$class.'.php';
}
}
Используйте spl_autoload_register вместо __autoload. Это позволит вам добавить вашу функцию автозагрузки в стек.