PSR-0 已经被标记
Deprecated, 由 PSR-4 来代替. 但是非常有必要了解这第一个标准的内容
标准条例:
- 合格的
namespace和class满足这样的结构\<Vendor Name>\(<Namespace>\)*<Class Name>. - 每个
namespace必须有一个顶层的namespace("Vendor Name"提供者名字). - 每个
namespace可以有多个子namespace. - 当从文件系统中加载时,每个
namespace的分隔符(\) 要转换成DIRECTORY_SEPARATOR. - 在类名中, 每个下划线(
_)符号要转换成DIRECTORY_SEPARATOR. 在namespace中, 下划线(_)符号是没有特殊意义的. - 当从文件系统中载入时, 合格的
namespace和class一定是以.php结尾的. -
verdor name,namespaces,class名可以由大小写字母组合而成, 大小写敏感.
合格的
namespace和class满足这样的结构\<Vendor Name>\(<Namespace>\)*<Class Name>
比如定义类: \Doctrine\Common\IsolatedClassLoader, 大概会像下面这样子:
<?php
namespace Doctrine\Common;
class IsolatedClassLoader {
//...
}
-
<Vendor Name>: 对应到:Doctrine. -
<namespace>: 对应到:Common. -
<Class Name>: 对应到:IsolatedClassLoader.
每个
namespace必须有一个顶层的namespace("Vendor Name"提供者名字).
每个namespace可以有多个子namespace.
这里规定每个类都需要给于一个命名空间, 可以没有子命名空间, 也可以有多个子命名空间.
比如类: \Zend\Acl: Zend 为 "Vendor Name", Acl 为 "Class Name", 不存在子命名空间.
比如类: \Zend\Mail\Message: 则存在子命名空间: Mail.
当从文件系统中加载时,每个
namespace的分隔符(\) 要转换成DIRECTORY_SEPARATOR.
当从文件系统中载入时, 合格的namespace和class一定是以.php结尾的.
这2条规定就是通过类名反向解析类文件的具体路径.
-
\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
在类名中, 每个下划线(
_)符号要转换成DIRECTORY_SEPARATOR. 在namespace中, 下划线(_)符号是没有特殊意义的.
这条主要是兼容老的版本而设置的. 对于 Class Name 中有 _ 的存在. 替换成目录符, 在 Zend Framework 1 大量使用, 那时候PHP还未支持 namespace.
-
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
verdor name,namespaces,class名可以由大小写字母组合而成, 大小写敏感.
在 Linux 系统中. 对大小写是敏感的.
标准的 autoload 函数封装
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');
需要注意先把 Class 所在的根目录添加到PHP的 include_path 中.