working - php namespace autoload psr 4




PSR-0和PSR-4有什麼區別? (3)

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

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

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

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

我的理解是:

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

讚賞解釋差異的例子。


以下是主要差異,

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-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的內容。





psr-4