PHP PSR-0 自動加載規範

自動加載規範

此規範已被棄用 - 本規範已於2014年10月21日被標記爲棄用,目前最新的替代規範爲 [PSR-4] 。php

本文是爲自動加載器(autoloader)實現通用自動加載,所須要遵循的編碼規範。git

規範說明

  • 一個標準的 命名空間(namespace) 與 類(class) 名稱的定義必須符合如下結構:
    \<Vendor Name>\(<Namespace>\)*<Class Name>github

  • 其中Vendor Name爲每一個命名空間都必需要有的一個頂級命名空間名;函數

  • 須要的話,每一個命名空間下能夠擁有多個子命名空間;ui

  • 當根據完整的命名空間名從文件系統中載入類文件時,每一個命名空間之間的分隔符都會被轉換成文件夾路徑分隔符;編碼

  • 類名稱中的每一個 _ 字符也會被轉換成文件夾路徑分隔符,而命名空間中的 _ 字符則是無特殊含義的。spa

  • 當從文件系統中載入標準的命名空間或類時,都將添加 .php 爲目標文件後綴;code

  • 組織名稱(Vendor Name)命名空間(Namespace) 以及 類的名稱(Class Name) 可由任意大小寫字母組成。get

範例

  • \Doctrine\Common\IsolatedClassLoader => /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.phpit

  • \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

命名空間以及類名稱中的下劃線

  • \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

以上是使用通用自動加載必須遵循的最低規範標準, 可經過如下的示例函數 SplClassLoader 載入 PHP 5.3 的類文件,來驗證你所寫的命名空間以及類是否符合以上規範。

實例

如下示例函數爲本規範的一個簡單實現。

<?php

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;
}

SplClassLoader 實例

如下的 gist 是 一個 SplClassLoader 類文件的實例,若是你遵循了以上規範,能夠把它用來載入你的類文件。 這也是目前 PHP 5.3 建議的類文件載入方式。

Gist地址

轉自Github(PizzaLiu)

相關文章
相關標籤/搜索