一、PSR0簡介
下文描述了若要使用一個通用的自動加載器(autoloader)
,你所需要遵守的規範:
- 一個完全標準的
命名空間(namespace)
和類(class)
的結構是這樣的:\<Vendor Name>\(<Namespace>\)*<Class Name>
- 每個
命名空間(namespace)
都必須有一個頂級的空間名(namespace)
("組織名(Vendor Name)
")。 - 每個
命名空間(namespace)
中可以根據需要使用任意數量的子命名空間(sub-namespace)
。 - 從文件系統中加載源文件時,
空間名(namespace)
中的分隔符將被轉換爲DIRECTORY_SEPARATOR
。 類名(class name)
中的每個下劃線_
都將被轉換爲一個DIRECTORY_SEPARATOR
。下劃線_
在空間名(namespace)
中沒有什麼特殊的意義。- 完全標準的
命名空間(namespace)
和類(class)
從文件系統加載源文件時將會加上.php
後綴。 組織名(vendor name)
,空間名(namespace)
,類名(class name)
都由大小寫字母組合而成。
二、實現PSR0自動加載
-
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');
三、PSR4簡介
-
術語「類」是一個泛稱;它包含類,接口,traits 以及其他類似的結構;
-
完全限定類名應該類似如下範例:
<NamespaceName>(<SubNamespaceNames>)*<ClassName>
- 完全限定類名必須有一個頂級命名空間(Vendor Name);
- 完全限定類名可以有多個子命名空間;
- 完全限定類名應該有一個終止類名;
- 下劃線在完全限定類名中是沒有特殊含義的;
- 字母在完全限定類名中可以是任何大小寫的組合;
- 所有類名必須以大小寫敏感的方式引用;
-
當從完全限定類名載入文件時:
- 在完全限定類名中,連續的一個或幾個子命名空間構成的命名空間前綴(不包括頂級命名空間的分隔符),至少對應着至少一個基礎目錄。
- 在「命名空間前綴」後的連續子命名空間名稱對應一個「基礎目錄」下的子目錄,其中的命名 空間分隔符表示目錄分隔符。子目錄名稱必須和子命名空間名大小寫匹配;
- 終止類名對應一個以
.php
結尾的文件。文件名必須和終止類名大小寫匹配;
-
自動載入器的實現不可拋出任何異常,不可引發任何等級的錯誤;也不應返回值;
四、Composer對PSR4的處理
'\<span style="font-size:14px;">\Acme\\Log\\Writer</span>' => (array) './acme-log-writer/lib/'
使用自動加載時,先通過名稱空間的前綴,找到對應的映射路徑,在根據PSR0規範找到對應的類定義文件。但是這裏有些例外,類名中的下劃線在PSR4中是不需要轉換成目錄的。