Замена для функции PHP __autoload? - PullRequest
7 голосов
/ 13 апреля 2010

Я читал о динамической загрузке ваших файлов классов при необходимости в такой функции:

function __autoload($className)
{
   include("classes/$className.class.php");
}

$obj = new DB();

, который автоматически загружает DB.class.php, когда вы создаете новый экземпляр этого класса, но я также читал в нескольких статьях, что использовать его неправильно, поскольку это глобальная функция, и любые библиотеки, которые вы привносите в свой проект, есть функция __autoload() испортит ее.

Так кто-нибудь знает решение? Возможно, другой способ добиться того же эффекта, что и __autoload()? Пока я не найду подходящее решение, я продолжу использовать __autoload(), так как оно не станет проблемой, пока вы не введете библиотеки и все такое.

Спасибо.

Ответы [ 6 ]

10 голосов
/ 13 апреля 2010

Я использовал следующий код для использования 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).

7 голосов
/ 13 апреля 2010

Вы можете использовать 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;
4 голосов
/ 13 апреля 2010

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

if (function_exists('__autoload')) {
    spl_autoload_register('__autoload');
}
3 голосов
/ 13 апреля 2010

Используйте spl_autoload_register вместо __autoload. Это позволит вам добавить функцию автозагрузки в стек.

0 голосов
/ 13 апреля 2010

Лучшее, что вы можете сделать - это определить собственный объект , отвечающий за автозагрузку для любой подсистемы, которую вы программируете.

Например:

class BasketAutoloader
{
  static public function register()
  {
    spl_autoload_register(array(new self, 'autoload'));
  }

  public function autoload($class)
  {
    require dirname(__FILE__).'/'.$class.'.php';
  }
}
0 голосов
/ 13 апреля 2010

Вы можете использовать Zend_Loader . (Предполагая, что Zend Framework доступен для вас ...)

...