2017-01-03 77 views

回答

2
  1. 作曲家自動加載背後的邏輯是什麼?
  2. 它如何將名稱空間映射到特定文件?
  3. 爲什麼我們總是需要使用該類的名稱空間?

答案: 3.在很多編程語言使用到具有相同名稱的獨立類的命名空間,但不同的層次 - 這最好的例子就是Eloquent BuilderQuery Builder。那麼,想一下'文件路徑'就像在你的硬盤中,你可以說,名爲b.txt的文件在目錄dir-adir-b中,但是它們保留了它們自己的內容嗎?無論如何,它不會傷害閱讀the php documentation regarding namespace

(1,2)。作曲家讀取composer.json來檢查哪個路徑代表一個名稱空間,並且列出每個 php文件,並將它們存儲到autoload_*.php(如果你問我文件的位置在哪裏,它就在你的/vendor/composer/的所有內容中,以autoload開頭。Laravel - 或者更確切地說,Composer - 知道如何通過這些文件加載​​它們以及它們位於何處。如果您檢查了這些文件,您將會有一個想法。您需要記住Composer的自動加載中的只有慣例是隻有一個文件一個班,它的類名應與文件名完全相同(不含php部分 - 是的,這與PSR-*有關)

ps。糾正我,如果我是錯了。

+0

它如何讀取使用的命名空間,以及如何將它轉換爲路徑?它將文件作爲文本讀取,然後找到關鍵字'use'? – bruce

+0

關於'use'和'namespace'的關鍵字嚴格遵守php。 Composer只處理在哪個文件路徑上的哪個命名空間,包含哪些類等 - 它只列出它們,[示例](https://bitbucket.org/BagusTesa/ashadi-delivery-system-ads/src/f4bfdca18e87b3c38b802359b3c30db45d99ba2e/vendor/composer /autoload_classmap.php?at=master&fileviewer=file-view-default)。 –

+0

是的,但如果我不使用'使用'它說沒有找到類。這意味着它以某種方式通過邏輯轉換爲完整路徑。 – bruce

1

我們假設您單獨使用autoload這意味着它不包含範圍(namespace)。

這意味着如果您安裝了第三方依賴關係,那麼在供應商文件夾中相同名稱的類(很可能會存在)將會出現衝突,導致您的應用程序出現致命錯誤。

作曲家類的自動加載功能也符合PSR-4 Standards

Composer如何映射文件?

這在composer.json文件中指定,例如:

{ 
    "autoload": { 
     "psr-4": { 
      "App\\": "src/" 
     } 
    } 
} 

App將命名空間,並src將文件夾

這也是單元測試非常有用,你可以做以下只是開發環境:

"autoload-dev":{ 
    "psr-4" : { 
     "App\\Test\\": "tests/" 
    } 
    } 
+0

是的,但它如何將名稱空間映射到特定文件? – bruce

+0

@bruce我剛剛擴展了我的答案 – meda