PHP composer 包管理和class類自動載入有什麼聯絡?越詳細越好
回複內容:
PHP composer 包管理和class類自動載入有什麼聯絡?越詳細越好
本質而言兩者關聯不大
自動載入是spl_autoload_register註冊的自動載入函數實現(通過重載__autoload函數也可以實現,不過不推薦,這樣一來只能有一個autoload函數),你可以自己寫這個函數,一般來說需要包括對namespace和class類名的解析,並且把它include進來。所有註冊的自動載入函數會在PHP找不到某個類的時候依次觸發。(這裡的函數是一個callable對象,包括:類方法(動靜皆可),Closure閉包(Lambda函數),普通函數)
composer通過每個包的composer.json提供的require的配置來管理組件之間的依賴,並且同時它提供了一個autoload的實現來載入這些包下面的類
只要你的代碼的類的儲存路徑是按照PSR-4標準(推薦)和PSR-0標準來規劃的,你可以利用composer的autoload來管理你自己的類,這個稍微去翻下composer的文檔即可
所以composer是個包管理器,它管理的是包而不是類,不過提供了一個載入這些包內類的autoload實現,但不妨礙你自己實現一個你自己的。
spl_autoload_register: http://php.net/manual/zh/function.spl-autoload-register.php
PSR-4: http://www.php-fig.org/psr/psr-4/ 漢化: https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-4-autoloader-cn.md
PSR-0: http://www.php-fig.org/psr/psr-0/ 漢化: https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-0-cn.md
完全兩個東西嘛
composer是把你依賴的項目從源安裝,舉個不是很恰當的例子,Linux系統有很多包都是相互依賴的,當package A以來package B時,B也會安裝.
類自動載入是你不大可能只用一個檔案或者class就處理完所有業務,比如說MVC架構,不同controller之間可能要相互調用,controllerA.php檔案裡沒有controllerB.php的代碼,只能通過類的自動載入實現.將controllerB.php載入進 A 的上下文.
這兒有一篇講解PHP自動載入機制的可以看看PHP自動載入器