Новичок в PHP - Автозагрузка и защита классов PHP

Я заинтересован в изучении автозагрузки, но новичок в PHP. Я читаю книгу «PHP в действии», в которой описан метод автозагрузки, например

function __autoload($className) {
 include_once __autoloadFilename($className);
}
function __autoloadFilename($className) {
 return str_replace('_','/',$className).".php";
}

Я хочу упаковать эти методы в класс. будет ли лучше упаковать их в абстрактный класс?

Или в обычном классе и включить его в index.php?

Насколько эффективно я могу использовать функцию автозагрузки?

Спасибо


person user991047    schedule 12.10.2011    source источник
comment
Связанный: stackoverflow.com/questions/7713072/ (также см. мой ответ там)   -  person igorw    schedule 12.10.2011


Ответы (2)


Закрепляя автозагрузчик, убедитесь:

  • Что файл, который вы пытаетесь загрузить, на самом деле является файлом. include очень похож на eval. Например, запретить включение URL через конфигурацию php.
  • Что имя класса на самом деле является синтаксически правильным именем класса. Может быть полезно для защиты вещей ;)

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

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

Некоторая быстро написанная заглушка класса автозагрузчика:

class MyAutoloader
{
    public function __construct()
    {
        $this->register();
    }
    public function register()
    {
        spl_autoload_register(array($this,'autoload'));
    }
    public function autoload($classname)
    {
        if ($this->isInvalidClassName($classname)) return;
        $file = $this->getFileForClassName($classname);
        if ($this->isInalidFile($file)) return;
        require $file; // bail out fatally.
    }
    ...
}

$myAutoloader = new MyAutoloader();
person hakre    schedule 12.10.2011

Тебе решать. Я использую выделенный класс Loader с методом load(), который я активирую с помощью:

spl_autoload_register( 'Utility_Loader::load' );
person Rijk    schedule 12.10.2011