[轉]PHP開發者必須瞭解的工具—Composer

本文轉自:https://blog.csdn.net/Zhihua_W/article/details/80345973php

Composer是PHP 用來管理依賴(dependency)關係的工具。你能夠在本身的項目中聲明所依賴的外部工具庫(libraries),Composer 會幫你安裝這些依賴的庫文件。對於PHP開發者來講掌握Composer是必須的。對於使用者來講Composer很是的簡單,經過簡單的一條命令將須要的代碼包下載到vendor目錄下,而後開發者就能夠引入包並使用了。git

Composer由來json

PHP最先加載類的方法在咱們初學PHP時最先會面對的問題之一就是require與include差異何在?require_once與include_once又是什麼?當咱們明白這些問題以後在項目開發中,若是項目未使用框架,則會出現不少這樣的代碼:composer

require 'x1_class.php';
require 'x2_class.php';
require 'x3_class.php';
這樣寫咱們又有了新的問題,許多文檔用到一樣的幾個class類文件,因而在不一樣的地方都要從新載入一次,當類別多了起來,會顯得很亂;此時,咱們又想了一個新的方法,寫一個PHP文件,負責載入全部的類文件,而後再其餘文檔中都載入這個文件,結果又有問題了:當類文件不少的時候,隨便一個Web Page都會載入一堆Code,佔用大量內存,怎麼辦呢?框架

爲解決這個問題,PHP 5開始提供__autoload這種俗稱「magic method」的函式。當你要使用的類別PHP找不到時,它會將類別名稱當成字串丟進這個函式,在PHP噴error投降以前,作最後的嘗試:工具

// autoload.php
function __autoload($classname) {
if ($classname === 'xxx.php'){
$filename = "./". $classname .".php";
include_once($filename);
} else if ($classname === 'yyy.php'){
$filename = "./library1/". $classname .".php";
include_once($filename);
} else if ($classname === 'zzz.php'){
$filename = "./library2/". $classname .".php";
include_once($filename);
}
}
也由於PHP這種「投降前最後一次嘗試」的行爲,有時會讓沒注意到的人困惑「奇怪個人code怎麼跑得動?我根本沒有require啊」,因此被稱爲「magic method」。如此一來,問題看來彷佛解決了?若是咱們仔細分析仍是會發現一個問題,就是這個__autoload函式內容會變得很巨大。以上面的例子來講,一下會去根目錄找、一下會去library1資料夾、一下會去library2資料夾尋找。在整理加載文件的時候,顯得有些混亂。
因而PHP從5.1.2開始,多提供了一個函式 「spl_autoload_register」。能夠多寫幾個autoload函式,而後註冊起來,效果跟直接使用__autoload相同。如今能夠針對不一樣用途的類別,分批autoload了。ui

spl_autoload_register('library1_loader');
spl_autoload_register('library2_loader');
spl_autoload_register('basic_loader');

function library1_loader($classname) {
$filename = "./library1/". $classname .".php";
include_once($filename);
}

function library2_loader($classname) {
$filename = "./library/". $classname .".php";
include_once($filename);
}

function basic_loader($classname) {
$filename = "./". $classname .".php";
include_once($filename);
}
每一個loader內容能夠作不少變化。能夠多寫判斷式讓它更智慧、能夠進行字串處理。自動載入類文件的問題算是終於解決了。可是此時咱們又有新的需求:有沒有辦法自動產生上面的那些代碼呢?能不能給你library1資料夾跟library2資料夾,自動進去看到什麼類文件就所有想辦法用spl_autoload_register記起來好很差?例以下面代碼這樣:.net

$please_autoload = array( 'library1', 'library2');
可不能夠發明一個工具,去執行$please_autoload這個變數,而後本身想辦法載入一切呢?也可能我連php程式碼都懶得打了,在Web領域JSON格式更簡潔。容許我這樣打,好嗎?命令行

{
"autoload": [
"library1",
"library2"
]
}
這樣能夠嗎?
能夠,因此Composer誕生。Composer對於使用者來講是很透明,可是其背後的理念仍是須要了解一下的,其的誕生也不是偶然的,得益於Github的快速發展,PHP語言也愈來愈現代化,顯得更高大上了。其中的關鍵在於你項目定義的composer.json,能夠定義項目須要依賴的包(可能有多個),而依賴的包可能又依賴其餘的包(這就是組件的好處),這些都不用你煩心,Composer會自動下載你須要的一切,一切在於composer.json的定義。code

Composer的結構

Composer命令行工具:

這個理解就比較簡單了,經過使用者定義的Composer.json去下載你須要的代碼,假如只是簡單的使用Composer,那麼掌握一些具體命令就徹底能夠了。

composer init:使用者能夠在本身的項目下建立composer.json以便定義你項目的依賴包,也能夠經過composer init交互式的建立composer.json。
composer install:應該是最經常使用的命令,composer會根據本地的composer.json安裝包,將下載的包放入項目下的vendor目錄下,同時將安裝時候的包版本信息放入到composer.lock,以便鎖定版本。其實在install的時候,假如發現composer.lock版本和目前vendor目錄下的代碼版本是一致的,則Composer會什麼也不作,composer.lock的目的就是讓你安心在目前這個版本下工做,而不獲取最新版本的包。
composer update:那麼如何更新composer.lock以便獲取到最新版本的包呢?經過這個命令便可更新最新版本的包。
composer config:這個命令仍是建議瞭解下,全局的配置保存在COMPOSER_HOME/config.json,非全局的配置信息則存儲在本項目目錄下。
composer global:這是一個全局的安裝命令,它容許你在COMPOSER_HOME目錄下執行Composer的命令,好比install、update。固然你的COMPOSER_HOME要在$PATH環境下。
composer dump-autoload:當你修改項目下的composer.json的文件,並不必定要運行composer update命令進行更新,有的時候可使用該命令來更新加載器,好比你要引用本地自定義的包(不是來自於packagist),後面會經過實踐來講明該命令。
composer require:假如手動或者交互式建立composer.json文件,能夠直接使用該命令來安裝包。
Autoloading代碼加載器:

經過Composer,開發者能夠經過多種方式去使用,而其中的關鍵在於PHP的命名空間概念,以及PSR-4標準的發展,Composer只是根據這兩者開發了一個代碼自動加載器。

Github:

有了Github,PHP開發人員能夠將開源的代碼託管在這上面,而Composer的發展源於Github,Composer本質上就是將Github上的代碼下載到本地。

Packagist:

對於使用者來講使用的是Composer的命令行工具,那麼命令行工具怎麼知道有多少包能夠被用戶使用呢,這主要就是依賴於Packagist,Packagist是Composer主要的一個包信息存儲庫,包開發者將具體代碼託管到Github上,將包信息提交到Packagist上,這樣使用者就能夠經過Composer去使用。

Composer根據本地定義的composer.json信息去查詢Packagist,Packagist根據Composer.json/Package.json信息解析,最終對應到Github倉庫,Composer最終下載代碼的時候還要依賴於Github倉庫上的Composer.json,這裏涉及到三種類型的composer.json,含義是不同的。

Composer.json:

這是Composer的核心,是Composer的規則,上面也提到了三種類型的Composer.json,在使用的時候必定要注意區分,初學的時候不要把它們搞亂。

在本文上面也屢次提到了composer.json,好比你但願使用第三方包則須要在本地定義composer.json,Composer安裝第三方包後,也會在第三方包目錄下發現composer.json,那麼這兩者都叫composer.json,有什麼區別呢?理解這很是的重要。假如你在本身的項目下面定義一個composer.json,則這個包稱之爲ROOT包,這個composer.json定義你項目須要的條件(好比你的項目可能依賴一個第三方包)。composer.json中有些屬性只能被ROOT包使用,好比config屬性只在ROOT包中生效。一個資源包是否是ROOT包,取決於它的上下文,好比你git clone ywdblog/phpcomposer,則這時候本地phpcomposer目錄就是ROOT包,假如你在本地phpcomposer目錄下composer require ywdblog/phpcomposer,則這時候你的項目phpcomposer就是ROOT包。

相關文章
相關標籤/搜索