Замена для PHP's __ автоматически загружает функцию?

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

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

$obj = new DB();

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

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

Спасибо.

7
задан Josh 13 April 2010 в 14:54
поделиться

6 ответов

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

11
ответ дан 6 December 2019 в 07:05
поделиться

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

0
ответ дан 6 December 2019 в 07:05
поделиться

Вы можете использовать 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;
7
ответ дан 6 December 2019 в 07:05
поделиться

Правильным способом было бы использовать spl_autoload_register . Чтобы сохранить функцию __ autoload , которую представили некоторые сторонние производители, вы можете поместить эту функцию в стек автозагрузки а также:

if (function_exists('__autoload')) {
    spl_autoload_register('__autoload');
}
4
ответ дан 6 December 2019 в 07:05
поделиться

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

Например:

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

  public function autoload($class)
  {
    require dirname(__FILE__).'/'.$class.'.php';
  }
}
0
ответ дан 6 December 2019 в 07:05
поделиться

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

3
ответ дан 6 December 2019 в 07:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: