簡體   English   中英

為什么在使用Composer的psr-4自動加載時指定命名空間?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM