PSR-0 已經被標記
Deprecated, 由 PSR-4 來代替. 但是非常有必要了解這第一個標準的內容
標準條例:
- 合格的
namespace和class滿足這樣的結構\<Vendor Name>\(<Namespace>\)*<Class Name>. - 每個
namespace必須有一個頂層的namespace("Vendor Name"提供者名字). - 每個
namespace可以有多個子namespace. - 當從文件系統(tǒng)中加載時,每個
namespace的分隔符(\) 要轉換成DIRECTORY_SEPARATOR. - 在類名中, 每個下劃線(
_)符號要轉換成DIRECTORY_SEPARATOR. 在namespace中, 下劃線(_)符號是沒有特殊意義的. - 當從文件系統(tǒng)中載入時, 合格的
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.
這里規(guī)定每個類都需要給于一個命名空間, 可以沒有子命名空間, 也可以有多個子命名空間.
比如類: \Zend\Acl: Zend 為 "Vendor Name", Acl 為 "Class Name", 不存在子命名空間.
比如類: \Zend\Mail\Message: 則存在子命名空間: Mail.
當從文件系統(tǒng)中加載時,每個
namespace的分隔符(\) 要轉換成DIRECTORY_SEPARATOR.
當從文件系統(tǒng)中載入時, 合格的namespace和class一定是以.php結尾的.
這2條規(guī)定就是通過類名反向解析類文件的具體路徑.
-
\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 系統(tǒng)中. 對大小寫是敏感的.
標準的 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 中.