Spec-Zone.ru › Phalcon 2

Загрузчик универсальных классов

Phalcon\Loader — компонент, который позволяет автоматически загружать классы проекта на основе предварительно определённых правил. Так как этот компонент написан на C, он обеспечивает минимальную нагрузку при чтении и интерпретации внешних файлов PHP.

Работа компонента основана на возможности PHP автоматической загрузки классов. Если в какой-либо части кода используется несуществующий класс, специальный обработчик попытается его загрузить. Phalcon\Loader выполняет роль этого специального обработчика. Загрузка классов по мере необходимости повышает общую производительность, так как считываются только необходимые файлы. Эта техника называется ленивой инициализацией.

С помощью этого компонента вы можете загружать файлы из других проектов или поставщиков. Этот автозагрузчик совместим со спецификацией PSR-0.

Phalcon\Loader предлагает четыре способа автоматической загрузки классов. Вы можете использовать их по одному или комбинировать.

Регистрация пространств имён

Если вы организуете свой код с использованием пространств имён или внешние библиотеки делают это, регистрация пространств имён (registerNamespaces()) обеспечивает механизм автоматической загрузки. Она принимает ассоциативный массив, ключами которого являются префиксы пространств имён, а значениями — каталоги, в которых расположены классы. Разделитель пространств имён заменяется на разделитель каталогов, когда загрузчик ищет классы. Не забудьте всегда добавлять конечный слэш в конце путей.

// Creates the autoloader
$loader = new \Phalcon\Loader();

//Register some namespaces
$loader->registerNamespaces(
    array(
       "Example\Base"    => "vendor/example/base/",
       "Example\Adapter" => "vendor/example/adapter/",
       "Example"         => "vendor/example/",
    )
);

// register autoloader
$loader->register();

// The required class will automatically include the
// file vendor/example/adapter/Some.php
$some = new Example\Adapter\Some();

Регистрация префиксов

Эта стратегия похожа на стратегию пространств имён. Она принимает ассоциативный массив, ключами которого являются префиксы, а значениями — каталоги, в которых расположены классы. Разделитель пространств имён и символ «_» (подчёркивание) заменяются на разделитель каталогов, когда загрузчик ищет классы. Не забудьте всегда добавлять конечный слэш в конце путей.

// Creates the autoloader
$loader = new \Phalcon\Loader();

//Register some prefixes
$loader->registerPrefixes(
    array(
       "Example_Base"     => "vendor/example/base/",
       "Example_Adapter"  => "vendor/example/adapter/",
       "Example_"         => "vendor/example/",
    )
);

// register autoloader
$loader->register();

// The required class will automatically include the
// file vendor/example/adapter/Some.php
$some = new Example_Adapter_Some();

Регистрация каталогов

Третий вариант — регистрация каталогов, в которых могут быть найдены классы. Этот вариант не рекомендуется с точки зрения производительности, так как Phalcon должен будет выполнить значительное количество операций проверки файлов в каждом каталоге, ища файл с таким же именем, что и класс. Важно регистрировать каталоги в нужном порядке. Не забудьте всегда добавлять конечный слэш в конце путей.

// Creates the autoloader
$loader = new \Phalcon\Loader();

// Register some directories
$loader->registerDirs(
    array(
        "library/MyComponent/",
        "library/OtherComponent/Other/",
        "vendor/example/adapters/",
        "vendor/example/"
    )
);

// register autoloader
$loader->register();

// The required class will automatically include the file from
// the first directory where it has been located
// i.e. library/OtherComponent/Other/Some.php
$some = new Some();

Регистрация классов

Последний вариант — регистрация имени класса и его пути. Этот автозагрузчик может быть очень полезен, когда соглашение о структуре папок проекта не позволяет легко получить файл с помощью пути и имени класса. Это самый быстрый метод автоматической загрузки. Однако, по мере роста приложения, в этот автозагрузчик необходимо добавлять всё больше классов/файлов, что значительно затрудняет техническое обслуживание списка классов, и поэтому не рекомендуется.

// Creates the autoloader
$loader = new \Phalcon\Loader();

// Register some classes
$loader->registerClasses(
    array(
        "Some"         => "library/OtherComponent/Other/Some.php",
        "Example\Base" => "vendor/example/adapters/Example/BaseClass.php",
    )
);

// register autoloader
$loader->register();

// Requiring a class will automatically include the file it references
// in the associative array
// i.e. library/OtherComponent/Other/Some.php
$some = new Some();

Дополнительные расширения файлов

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

// Creates the autoloader
$loader = new \Phalcon\Loader();

//Set file extensions to check
$loader->setExtensions(array("php", "inc", "phb"));

Изменение текущих стратегий

Дополнительные данные для автоматической загрузки могут быть добавлены к существующим значениям следующим образом:

// Adding more directories
$loader->registerDirs(
    array(
        "../app/library/",
        "../app/plugins/"
    ),
    true
);

Передача «true» в качестве второго параметра объединит текущие значения с новыми значениями в любой стратегии.

Уровень безопасности

Phalcon\Loader по умолчанию предлагает уровень безопасности, очищая имена классов, предотвращая возможную включение несанкционированных файлов. Рассмотрим следующий пример:

//Basic autoloader
spl_autoload_register(function($className) {
    if (file_exists($className . '.php')) {
        require $className . '.php';
    }
});

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

//This variable is not filtered and comes from an insecure source
$className = '../processes/important-process';

//Check if the class exists triggering the auto-loader
if (class_exists($className)) {
    //...
}

Если «../processes/important-process.php» — это допустимый файл, внешний пользователь может выполнить файл без авторизации.

Чтобы избежать таких или более сложных атак, Phalcon\Loader удаляет любые недопустимые символы из имени класса, уменьшая вероятность атаки.

События автоматической загрузки

В следующем примере EventsManager работает с загрузчиком классов, позволяя нам получить отладочную информацию о ходе операции:

$eventsManager = new \Phalcon\Events\Manager();

$loader = new \Phalcon\Loader();

$loader->registerNamespaces(array(
   'Example\\Base' => 'vendor/example/base/',
   'Example\\Adapter' => 'vendor/example/adapter/',
   'Example' => 'vendor/example/'
));

//Listen all the loader events
$eventsManager->attach('loader', function($event, $loader) {
    if ($event->getType() == 'beforeCheckPath') {
        echo $loader->getCheckedPath();
    }
});

$loader->setEventsManager($eventsManager);

$loader->register();

Некоторые события при возвращении значения false могут остановить активную операцию. Поддерживаются следующие события:

Имя события Вызвано Может остановить операцию?
beforeCheckClass Вызвано перед началом процесса автоматической загрузки Да
pathFound Вызвано, когда загрузчик обнаруживает класс Нет
afterCheckClass Вызвано после завершения процесса автоматической загрузки. Если это событие запускается, автозагрузчик не нашёл файл класса Нет

Поиск и устранение неполадок

Некоторые моменты, которые следует учитывать при использовании универсального автозагрузчика:

  • Процесс автоматической загрузки регистрозависимый; класс будет загружен так, как он написан в коде
  • Стратегии, основанные на пространствах имён/префиксах, быстрее, чем стратегия каталогов
  • Если установлен кэш байткода, например, APC, он будет использоваться для получения запрошенного файла (производится неявное кеширование файла)

© 2011–2016 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/2.0.0/reference/loader.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API