[英]Why specify the namespace when using psr-4 autoloading with Composer?
我對如何在Composer中使用psr-4自動加載感到困惑。 假設我有一個像這樣的文件夾結構:
/
|- Core/
| - Router.php
|- App/
| - Models
| User.php
|- composer.json
基本上,在項目根目錄中: composer.json ; 包含Router php類的Core文件夾; 一個App文件夾,其中包含一個包含User類的Models文件夾。
Router類看起來像這樣:
<?php
namespace Core;
class Router {
}
Users類看起來像這樣:
<?php
namespace App\Models;
class User {
}
所以我可以使用Composer psr-4自動加載器自動加載這些類,我可以在composer.json中執行此操作:
{
"autoload": {
"psr-4": {
"Core\\": "Core",
"App\\Models\\": "App/Models"
}
}
}
所以我可以使用這些類而不需要它們(在運行composer dump-autoload
),如下所示:
$router = new Core\Router();
$user = new App\Models\User();
這沒有問題。
但是,我也可以在composer.json中執行此操作:
{
"autoload": {
"psr-4": {
"": ""
}
}
}
根據文檔是相對於根的任何命名空間的回退目錄。 因此,通過在作曲家自動加載器中使用這個“空”條目,我相信“ 從根開始,在任何目錄中查找任何名稱空間中的類 ”,如果我按照正確的文件夾命名/我可以自動加載任何類命名結構。
所以我的問題是,如果后者有效並且更簡單,我為什么要做前者呢? 這是表演嗎? 還是有其他原因嗎?
你為什么不總是做"psr-4": {"": ""}
?
原因1:性價比高。 定義說,對於需要自動加載的每個類,Composer應該查看根目錄。 這些類不僅是包中的類,還包括所有其他類。
Composer試圖通過記住毫無結果的搜索來優化這一努力,但只有在加載具有相同前綴的另一個類時才會付出代價。
原因2:PSR-4的本質是您不必將整個命名空間路徑映射到目錄路徑。 假設你有一個包來處理一個非常特定的類,比如\\Vendor\\Template\\Escaping\\Output\\*
,沒有別的東西(有了小包使它更容易重用它們而不添加太多代碼),你可以擁有它們在src/Vendor/Template/Escaping/Output/AnyClass.php
和define中
"psr-4": {
"\\Vendor\\Template\\Escaping\\Output\\": "src/Vendor/Template/Escaping/Output/"
}
您還可以將該類放入src/AnyClass.php
並定義
"psr-4": {
"\\Vendor\\Template\\Escaping\\Output\\": "src/"
}
這顯着縮短了目錄路徑,略微提高了速度(我認為 - 雖然沒有數字),但主要是由於空文件夾打開較少而改進了開發。
在同一個包中同時擁有Core
命名空間和App
命名空間讓我產生懷疑:為什么每個都沒有一個包?
通常,在使用composer時,您只有一個文件夾用於您自己的項目。 然后,您只需指定一個名稱空間。
請考慮將文件結構重新排列為
/
|- lib/
| - Core/
| - Router.php
| - App/
| - Models
| User.php
|- composer.json
並將您的composer.json更改為
{
"autoload": {
"psr-4": {
"MyApp\\": "lib/"
}
}
}
那么你只有一個指定的命名空間,你不需要添加任何進一步的命名空間。 你可以像這樣打電話給你的課:
$router = new \MyApp\Core\Router;
$user = new \MyApp\App\Models\User;
或者像這樣:
namespace MyApp;
$router = new Core\Router;
$user = new App\Models\User;
PSR-4是將名稱空間轉換為物理目錄的標准。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.