關於php規範psr4與psr0命名空間的理解

2021-08-03 22:46:57 字數 1437 閱讀 6082

這幾天在看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...