php-fig,它的**是:www.php-fig.org。就是這個聯盟組織發明和創造了psr規範,其中自動載入涉及其中兩個規範,乙個是psr0,乙個是psr4, psr0規範已經過時了,官方有提示,現在主要是用psr4規範定義自動載入標準。
這個 psr 描述的是通過檔案路徑自動載入類的指南;它作為對 psr-0 的補充;根據這個 指導如何規範存放檔案來自動載入;
術語「類」是乙個泛稱;它包含類,介面,traits 以及其他類似的結構;
完全限定類名應該類似如下範例:
()*當從完全限定類名載入檔案時:完全限定類名必須有乙個頂級命名空間(vendor name);
完全限定類名可以有多個子命名空間;
完全限定類名應該有乙個終止類名;
下劃線在完全限定類名中是沒有特殊含義的;
字母在完全限定類名中可以是任何大小寫的組合;
所有類名必須以大小寫敏感的方式引用;
在完全限定類名中,連續的乙個或幾個子命名空間構成的命名空間字首(不包括頂級命名空間的分隔符),至少對應著至少乙個基礎目錄。完全限定類名在「命名空間字首」後的連續子命名空間名稱對應乙個「基礎目錄」下的子目錄,其中的命名 空間分隔符表示目錄分隔符。子目錄名稱必須和子命名空間名大小寫匹配;
終止類名對應乙個以 .php 結尾的檔案。檔名必須和終止類名大小寫匹配;
自動載入器的實現不可丟擲任何異常,不可引發任何等級的錯誤;也不應返回值;
命名空間字首
基礎路徑
完全路徑
\acme\log\writer\file_writer
acme\log\write
./acme-log-writer/lib/
./acme-log-writer/lib/file_writer.php
\aura\web\response\status
aura\web
/path/to/aura-web/src/
/path/to/aura-web/src/response/status.php
\symfony\core\request
symfony\core
./vendor/symfony/core/
./vendor/symfony/core/request.php
\zend\acl
zend
/usr/includes/zend/
/usr/includes/zend/acl.php
大家注意看第二列和第四列,命名空間字首對應基礎路徑,命名空間字首之後的子命名空間必須對應**目錄(類名必須是php檔案)
上一節中封裝自動載入的方法比較簡單,無法自動載入帶命名空間的類
spl_autoload_register(function ($class)
// 獲取去掉命名空間字首後的類名
$relative_class = substr($class, $len);
// 將命名空間的中的分隔符替換為目錄分隔符,再加上基礎目錄和.php字尾,最終拼接成
// 檔案路徑
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
// 如果檔案存在則require
if (file_exists($file))
});
但是上面的方法只能適用固定的命名空間字首,不能通用。
<?php
namespace example;
/** * 下面這個例子實現了乙個命名空間字首對應多個基礎目錄
* * 現在我們的目錄結構是下面這樣:
* * /demo/autoload/
* controller/
* democontroller.php # foo\bar\democontroller
* admin/
* admincontroller.php # foo\bar\admin\admincontroller
* model/
* demomodel.php # foo\bar\demomodel
* admin/
* adminmodel.php # foo\bar\admin\adminmodel
* * foo\bar分別對應基礎路徑 /demo/autoload/controller 和 /demo/autoload/model
*/class psr4autoloaderclass
/***
* 新增乙個基礎路徑對應乙個命名空間字首
** @param string $prefix 命名空間字首.
* @param string $base_dir 命名空間類檔案的基礎路徑
* @param bool true為往陣列頭部新增元素,false為往陣列尾部新增元素
* @return void
*/public function addnamespace($prefix, $base_dir, $prepend = false)
// 將命名空間字首和基礎路徑存入陣列
if ($prepend) else
}/**
* 真正包含檔案方法,將給到類名檔案包含進來
** @param string $class 全限定類名(包含命名空間).
* @return 成功將返回檔案路徑,失敗則返回false
*/public function loadclass($class)
//去掉右邊的\
$prefix = rtrim($prefix, '\\');
}return false;
}/**
* 如果引數中的$prefix在$this->prefixes中存在,那麼將迴圈$this->prefixes[$prefix]裡的value(基礎路徑)
* 之後拼接檔案路徑,如果檔案存在將檔案包含進來
** @param string $prefix 命名空間字首.
* @param string $relative_class 真正的類名(不包含命名空間路徑的類名).
* @return mixed 包含成功返回檔案路徑,否則返回false
*/// 將陣列中所有的基礎路徑中的檔案包含進來
foreach ($this->prefixes[$prefix] as $base_dir)
}// 沒有找到檔案
return false;
}/**
*如果檔案存在則包含進來.
** @param string $file 檔案路徑.
* @return bool
*/protected function requirefile($file)
return false;
}}
PSR 4 自動載入
翻譯自 這個 psr 描述的是通過檔案路徑自動載入類的指南,它作為對 psr 0 的補充 根據這個來規範存放檔案以實現自動載入 術語class包含類class,介面inte ce,特性traits以及其他一些類似的結構 乙個完整的限定類名應該按照如下範例 當通過乙個完整的限定類名引入乙個檔案時 自動...
PSR 4 自動載入
autoloader 本 psr 是關於由檔案路徑 自動載入 對應類的相關規範,本規範是可互操作的,可以作為任一自動載入規範的補充,其中包括 psr 0,此外,本 psr 還包括自動載入的類對應的檔案存放路徑規範。2.詳細說明 此處的 類 泛指所有的class類 介面 traits可復用 塊以及其它...
PSR4自動載入
psr描述了類名和檔案路徑自動載入。1 class 指的是 class inte ce trait 以及其他類似結構體 2 乙個合格的類名應該是下面格式 必須有乙個頂級命名空間 可以包括一級或多級子命名空間的名字 必須包括乙個最終的類名 下劃線在這裡沒有任何特殊含義 類名大小寫敏感 3 例子 完整合...