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
中.