PSR(Proposing a Standards Recommendation,提出標準建議)是 PHP 社群共同制定的編碼規範,旨在讓程式碼更具可讀性、可維護性與互通性。常見的標準包括:
PSR-4 是 PSR-0 的改進版,兩者皆處理自動加載,但 PSR-4 更簡潔:
_ 有特殊含義,自動轉換為目錄分隔符這使得 PSR-4 的對應關係更直觀,減少不必要的目錄層級。
一個符合 PSR-4 的自動加載器通常包含以下方法:
class Autoload {
// 註冊自動加載函數到 SPL 堆疊
public function register();
// 新增命名空間前綴對應的基礎目錄
public function addNamespace($prefix, $base_dir, $prepend = false);
// 自動加載入口,由 SPL 呼叫
public function loadClass($class);
// 依前綴與相對類別名尋找對應檔案
public function loadMappedFile($prefix, $relative_class);
// 檢查檔案是否存在並引入
public function requireFile($file);
}
loadClass() 的迴圈查找機制public function loadClass($class) {
$prefix = $class;
while (false !== $pos = strrpos($prefix, '\\')) {
$prefix = substr($class, 0, $pos + 1);
$relative_class = substr($class, $pos + 1);
$mapped_file = $this->loadMappedFile($prefix, $relative_class);
if ($mapped_file) {
return $mapped_file;
}
$prefix = rtrim($prefix, '\\');
}
return false;
}
為什麼需要迴圈? 這是為了支援「巢狀命名空間」共用同一基礎目錄。例如:
Acme\Blog\Post 對應 src/Blog/Post.phpAcme\Blog\Comment 對應 src/Blog/Comment.php只需註冊 Acme\Blog\ 前綴對應 src/,即可自動解析兩者,無需分別註冊。
--core
- Autoload.php
--vendor
--test1
- hello.php
--test2
- world.php
- App.php
完整程式碼請參考 GitHub 範例專案。