PHP PSR-0 Autoloading Standard

PSR-0 已經被標記 Deprecated, 由 PSR-4 來代替. 但是非常有必要了解這第一個標準的內容

標準條例:

  • 合格的 namespaceclass 滿足這樣的結構 \<Vendor Name>\(<Namespace>\)*<Class Name> .
  • 每個 namespace 必須有一個頂層的 namespace("Vendor Name"提供者名字).
  • 每個 namespace 可以有多個子 namespace.
  • 當從文件系統(tǒng)中加載時,每個 namespace 的分隔符(\) 要轉換成 DIRECTORY_SEPARATOR .
  • 在類名中, 每個下劃線(_)符號要轉換成 DIRECTORY_SEPARATOR. 在 namespace 中, 下劃線(_)符號是沒有 特殊 意義的.
  • 當從文件系統(tǒng)中載入時, 合格的 namespaceclass 一定是以 .php 結尾的.
  • verdor name, namespaces, class 名可以由大小寫字母組合而成, 大小寫敏感.

合格的 namespaceclass 滿足這樣的結構 \<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)中載入時, 合格的 namespaceclass 一定是以 .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 中.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容