Обязательные требования, которые необходимо соблюдать для взаимодействия автозагрузчика.
Устаревший — по состоянию на 21.10.2014 PSR-0 отмечен как УСТАРЕВШИЙ. В качестве альтернативы теперь рекомендуется PSR-4.
Обязательно
- Полностью определенное пространство имен (
namespace) и класс (class) должны иметь следующую структуру:\<Vendor Name>\(<Namespace>\)*<Class Name> - Каждое пространство имен должно иметь пространство имен верхнего уровня ("Vendor Name").
- Каждое пространство имен может иметь столько подпространств имен, сколько пожелает.
- Каждый разделитель пространства имен преобразуется в
DIRECTORY_SEPARATORпри загрузке из файловой системы. - Каждый символ
_вCLASS NAMEпреобразуется вDIRECTORY_SEPARATOR. Символ_не имеет специального значения в пространстве имен. - Полностью квалифицированное пространство имен и класс добавляются суффиксом
.phpпри загрузке из файловой системы. - Алфавитные символы в именах поставщиков, пространствах имен и именах классов могут быть любой комбинацией нижнего и верхнего регистра.
Примеры
-
\Doctrine\Common\IsolatedClassLoader=>/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php -
\Symfony\Core\Request=>/path/to/project/lib/vendor/Symfony/Core/Request.php -
\Zend\Acl=>/path/to/project/lib/vendor/Zend/Acl.php -
\Zend\Mail\Message=>/path/to/project/lib/vendor/Zend/Mail/Message.php
Подчеркивания в пространствах имен и именах классов
-
\namespace\package\Class_Name=>/path/to/project/lib/vendor/namespace/package/Class/Name.php -
\namespace\package_name\Class_Name=>/path/to/project/lib/vendor/namespace/package_name/Class/Name.php
Стандарты, которые мы здесь устанавливаем, должны быть наименьшим общим знаменателем для безболезненной совместимости автозагрузчика. Вы можете проверить, что следуете этим стандартам, используя этот пример реализации SplClassLoader, который способен загружать классы PHP 5.3.
Пример реализации
Ниже приведен пример функции, наглядно демонстрирующий, как автоматически загружаются предложенные выше стандарты.
<?php
function autoload($className)
{
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
if ($lastNsPos = strrpos($className, '\\')) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
require $fileName;
}
spl_autoload_register('autoload');
Реализация SplClassLoader
Следующий gist — это пример реализации SplClassLoader, которая может загружать ваши классы, если вы следуете стандартам взаимодействия автозагрузчика, предложенным выше. Это текущий рекомендуемый способ загрузки классов PHP 5.3, которые следуют этим стандартам.