php working PSR-0和PSR-4有什麼區別?




php namespace autoload psr 4 (4)

我最近閱讀了關於命名空間以及它們的好處。

我在Laravel創建了一個項目,並試圖從類映射自動加載轉移到名稱空間。

我似乎無法理解PSR-0和PSR-4之間的實際區別。 我讀過的一些資源是

我的理解是:

  • PSR-4不會將下劃線轉換為目錄分隔符
  • 作曲家的某些特定規則導致目錄結構變得複雜,從而使得PSR-0命名空間冗長,從而創建了PSR-4

讚賞解釋差異的例子。


它們非常相似,所以它有點令人困惑並不奇怪。 總結是PSR-0對於PSR-4丟棄的PEAR風格的類名具有一些向後兼容性功能,因為它只支持命名空間代碼。 除此之外,PSR-4不會強制您將整個名稱空間作為目錄結構,而只是將其後的部分作為目錄結構。

例如,如果您將Acme\Foo\名稱空間定義為src/ PSR-0,則表示它將在src/Acme/Foo/Bar.php中查找Acme\Foo\Bar ,而在PSR-4中則會在src/Bar.php查找它,從而允許縮短目錄結構。 另一方面,有些人更喜歡使用完整的目錄結構來清楚地看到哪些命名空間,所以你也可以說, Acme\Foo\是在PSR-4的src/Acme/Foo ,它會給你相當於PSR-0行為如上所述。

對於新項目以及大多數意圖和目的,長話短說,您可以使用PSR-4並忘記所有關於PSR-0的內容。


命名空間/文件夾約定。

  • 類應根據其名稱空間存儲在文件夾中。
  • 通常,您將在根文件夾中創建一個src /目錄,與vendor /位於同一級別,並在此處添加項目。 以下是文件夾結構的一個例子。

psr-0和psr-4之間的區別

PSR-0

它已被棄用。 查看vendor/composer/autoload_namespaces.php文件,您可以看到它們映射到的名稱空間和目錄。

composer.json

 "autoload": {
        "psr-0": {
            "Book\\": "src/",
            "Vehicle\\": "src/"
        }
    } 
  • src / Book /History/UnitedStates.php尋找Book \ History \ UnitedStates
  • src / Vehicle /Air/Wings/Airplane.php中尋找Vehicle \ Air \ Wings \ Airplane

PSR-4

查看vendor/composer/autoload_psr4.php文件,您可以看到它們映射到的名稱空間和目錄。

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/",
        "Vehicle\\": "src/"
    }
}   
  • src /History/UnitedStates.php尋找Book \ History \ UnitedStates
  • src /Air/Wings/Airplane.php中尋找Vehicle \ Air \ Wings \ Airplane

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/Book/",
        "Vehicle\\": "src/Vehicle/"
    }
}    
  • 尋找Book \ History \ UnitedStates src / Book /History/UnitedStates.php
  • src / Vehicle /Air/Wings/Airplane.php中尋找Vehicle \ Air \ Wings \ Airplane

以下是主要差異,

1.例如,如果您定義Acme\Foo\名稱空間是錨定在src/

  • 與PSR-0它意味著它會在src/Acme/Foo/Bar.php尋找Acme\Foo\Bar
  • 而在PSR-4中,它將在src/Bar.php(where Bar class is)尋找Acme\Foo\Bar

2. PSR-4不會將下劃線轉換為目錄分隔符

3.你更喜歡使用帶名稱空間的PSR-4

4.即使類名與文件名不同,PSR-0也不起作用,就像考慮上面的例子一樣:

  • Acme\Foo\Bar ---> src/Acme/Foo/Bar.php (對於Bar類)將工作
  • Acme\Foo\Bar ---> src/Acme/Foo/Bar2.php (對於Bar類)不起作用

PSR-4就像'相對路徑',PSR-0,'絕對路徑'。

例如

配置:

'App\Controller' => 'dir/'

PSR-0自動載入:

App\Controller\IndexController --> dir/App/Controller/IndexController.php

PSR-4自動載入:

App\Controller\IndexController --> dir/IndexController.php

PSR-0和PSR-4的細節還有一些差異,請看這裡: PSR-4 : PSR-4





psr-4