傳統上編寫PHP程式的時候,當我們需要利用自己編寫的類別或他人提供的套件,就必須使用include()、require()等函式來導入我們要使用的腳本;而近代一點的可能會使用自動載入(autoload)策略,如psr-4之類的自動載入標準。
而composer除了進行套件管理之外,也可以幫你自動載入所安裝的套件,當然也可以自動載入自己寫的腳本。
Windows
https://getcomposer.org/download/ 到官方網站後,直接下載Composer-Setup.exe 安裝就好。
Ubuntu
先以curl下載composer腳本,以PHP執行腳本並在當前目錄建立composer.phar檔案,composer.phar是composer的執行檔案。
curl -sS https://getcomposer.org/installer | php
再將下載好的composer.phar移動至/usr/local/bin/comoposer
sudo mv composer.phar /usr/local/bin/composer
之後再以下列指令確保你的composer執行檔可被執行
sudo chmod +x /usr/local/bin/composer
最後在~/.bash_profile檔案中添加下行
PATH=/usr/local/bin:$PATH
之後在終端機輸入composer應該可以看到composer的命令列表
當我們安裝好composer之後,就可以利用composer來安裝套件,在開始之前必須將專案引入composer,在專案目錄下執行這個指令
composer init
經過一些問答之後,專案就成為了一個composer專案,會在專案目錄看到composer.json檔案,並且可以開始安裝套件,但在開始前我們要知道一些東西
https://packagist.org/ Packagist與composer有密切的關係,可以在上面尋找一些套件。
套件名稱以 "服務提供者/套件名稱" 方式表示,例如nesbot/carbon為例,nesbot就是套件的提供者,而carbon則為套件的名稱。
總共有三個部分,包含了:主要版本號、次要版本號、補丁版本號,並以" . "區隔,目前大部分的php套件遵守此編排方式。
一般情況我們不需要選擇套件的版本號,composer會選擇最穩定的版本來安裝。
以nesbot/carbon為例子,carbon是一個日期時間的套件,比起php內建的date()函式提供了更人性化的日期操作方式。
安裝套件大多數的情況下以composer require來取得套件
coomposer require nesbot/carbon
如果這是專案第一次安裝套件,可能會花費比較久的時間,安裝的同時composer會自動安裝相依套件。
完成套件安裝後,專案目錄會增加一個名為composer.lock的檔案,這個檔案紀錄了專案中套件的詳細版本資訊,而前面所產生的composer.json也會記錄專案中的套件資訊,但是版本號紀錄較為粗略。
除了產生一個composer.lock檔案之外,還會產生vendor資料夾,這個資料夾內放了安裝的套件及composer的自動載入檔案。
Install
剛接手一個新的專案時,需要安裝全部的套件(通常已經有composer.json檔案)
Update
(1)修改composer.json之後、(2)更新套件
在開始此用套件之前,必須先讓composer載入套件,不必一一載入,composer可以一次載入所有需要的套件。
require (__DIR__."/vendor/autoload.php");
記得開始使用套件前,要將套件的命名空間也一同載入,大多數的命名空間都和套件的目錄結構相同。
use Carbon\Carbon;
我使用這個套件做一個簡單的範例,計算出兩個日期相差了多久。
$day=Carbon::createFromFormat("Y-m-d H:i:s","2016-12-15 4:21:56");//以指定日期時間建立一個carbon實體
$now=Carbon::now();//以現在時間建立carbon實體
//設定時區
$now->setTimezone("Asia/Taipei");
$day->setTimezone("Asia/Taipei");
//取得該日期與現在時間的差距
$diff=$day->diffForHumans();
//輸出
echo "NOWTIME:" . $now . "<BR>";
echo "距離2016-12-15 4:21:56已經過了" .$diff ;
這個範例可以應用於文章、貼文之類的發表時間,顯示多久前發表,而不是顯示日期。
composer除了載入套件,也可以載入自己編寫的類別。
修改composer.json檔案
"autoload":{
"psr-4": {
"App\\":"app/"
}
}
因為將命名空間app設為指向app資料夾,所以必須新增一個名為app的資料夾
composer dump
再執行composer dump指令,告訴composer要幫忙自動載入
要注意的是,新增class檔案的時候,名稱記得要與class相同,否則會無法載入,並且要將class放在namespace App當中
app資料夾中的TestClass.php
namespace App;
class TestClass{
public function __construct()
{
echo "TestAutoload OK!!!!";
}
}
index.php
require (__DIR__."/vendor/autoload.php");
$testc=new \App\TestClass();
如果你的class名稱與檔案名稱不同,但不想修改檔案名稱時就不能使用psr4的策略來自動載入,可以選擇classmap,composer會載入指定資料夾內的所有class。
composer.json檔案
要求composer載入資料夾lib中的class。
"classmap": [
"lib"
]
一旦修改了composer.json中的autoload就要記得執行composer dump指令
lib中的TestC.php
class test{
public function __construct()
{
echo "Class Map OK!!!!";
}
}
index.php
require (__DIR__."/vendor/autoload.php");
$classmap=new test();
files策略就是載入指定的php檔案
Composer.json檔案
指定composer幫忙載入ClassTestFile.php。
"files": [
"ClassTestFile.php"
]
一樣記得執行composer dump指令
ClassTestFile.php
class good{
public function __construct()
{
echo "GOOD!!!!!";
}
}
index.php
require (__DIR__."/vendor/autoload.php");
$files=new good();
由上述三種自動載入策略,都只需要一行require就可以自動載入專案所有的類別,不必因為遺漏了include而導致程式錯誤。
composer使用其實相當簡單,不僅可以管理安裝的套件,還可以將自己的類別納入管理。
完整的範例程式
關於作者
粉絲專頁
文章分類