這幾天在看php自動載入相關知識,這裡記錄一下。
use 命名空間只是防止命名空間的衝突,使用時仍需引入,這一步由自動載入來做。
與psr0不同,psr4不再轉換 '_' 為檔案分隔符,且 psr4有字首gainia
以tp5的自動載入為例 loader.php -> autoload() -> findfile()
/**
* 查詢檔案
* @param $class
* @return bool
*/private static function findfile($class)
// 查詢 psr-4
$logicalpathpsr4 = strtr($class, '\\', ds) . ext;//替換檔案分隔符和字尾名
$first = $class[0];// $first = 't'
if (isset(self::$prefixlengthspsr4[$first])) }}
}}// 查詢 psr-4 fallback dirs
foreach (self::$fallbackdirspsr4 as $dir)
}// 查詢 psr-0
if (false !== $pos = strrpos($class, '\\')) else
if (isset(self::$prefixespsr0[$first])) }}
}}// 查詢 psr-0 fallback dirs
foreach (self::$fallbackdirspsr0 as $dir)
}return self::$map[$class] = false;
}
可以看到psr0和psr4處理方式很類似,主要區別在於:
psr4 在拼接檔案路徑時會剔除掉字首,而 psr0不會剔除。
psr0 會將類名中的 '_' 替換成 檔案分隔符。
可以看個psr4例子:
以第乙個為例, 傳入findfile()的$class 為 \acme\log\write\file_writer , 執行$dir . ds . substr($logicalpathpsr4, $length) 時剔除掉字首 acme\log\writer , 此時 $dir 為 ./acme-log-writer/lig/ ,拼接結果為 ./acme-log-writer/lib/file_writer.php
如果是psr0 , 不剔除字首,且替換下劃線為檔案分隔符,執行 $dir . ds . $logicalpathpsr0 結果為 ./acme-log-writer/lib/file/writer.php。
這些差異也導致 psr4的檔案路徑看起來比較簡潔。
PHP編碼規範之PSR 4
本 psr 是關於由檔案路徑 自動載入 對應類的相關規範,本規範是可互操作的,可以作為任一自動載入規範的補充,其中包括 psr 0,此外,本 psr 還包括自動載入的類對應的檔案存放路徑規範。此處的 類 泛指所有的class類 介面 traits可復用 塊以及其它類似結構。乙個完整的類名需具有以下結...
PHP 自動載入規範PSR 4
autoloaderautoloader 1.概述 本 psr 是關於由檔案路徑 自動載入 對應類的相關規範,本規範是可互操作的,可以作為任一自動載入規範的補充,其中包括 psr 0,此外,本 psr 還包括自動載入的類對應的檔案存放路徑規範。2.詳細說明 此處的 類 泛指所有的class類 介面 ...
PHP規範PSR0和PSR4的理解
下文描述了若要使用乙個通用的自動載入器 autoloader 你所需要遵守的規範 參考 以下,列出psr0構建的規範類的幾種形式 這個 psr 描述的是通過檔案路徑 自動載入 類的指南 它作為對 psr 0 的補充 根據這個 指導如何規範存放檔案來自動載入 術語 類 是乙個泛稱 它包含類,介面,tr...