一、PHP的一些臭曆史
Dependency Manager For PHP,Composer。在Composer還沒誕生之前,PHP的代碼很難被管理。雖然pear社群的支援,許多可重用代碼可以通過pear來獲得,但是pear在處理代碼關聯性上非常差,當然還有許多問題。Java領域有Maven工具, .Net 的VS工具內建了NuGet,都是非常好使的關聯管理器。但是PHP何去何從?Composer誕生了。它的誕生很大意義上是因為php的3.0版本被普及了,php的命名空間特性讓代碼包可以在全球級别上具備唯一識别性。當然有人說,我們可以在一個類的命名上做文章也可以做到,但是,會帶來許多問題,類名太長,命名重名性高,檔案的組織性識别性差等等。PHP根本無法忽略java,.net一直在被使用的package與命名空間的特性,php必須換血。随着php3.0 的普及,通過衆多第三方的努力,PHP社群迅猛的積累了許多可用的代碼庫,起初,大部分代碼庫都是分享在Github,采用git的方式擷取。雖然這個可取,但是關聯管理以及操作性上還是比較差。我們需要一個更加簡單的具備關聯管理的代碼庫管理工具。Yeah。Composer。
好了,說到這裡,或許許多人還很模糊。沒關系,我們采用嘗試動手,來熟悉Composer。
二、初體驗Composer
Composer具體點是什麼? 就是一個編譯壓縮過的phar檔案,一個可以執行的工具。
怎麼擷取?
Linux下
$ curl -sS https://getcomposer.org/installer | php
windows下
C:\Users\username>cd C:\bin
C:\bin>php -r "readfile('https://getcomposer.org/installer');" | php
完了,你可以在控制台下,輸入指令 php composer.phar 來擷取composer的使用幫助。
下面我們來示範一下,如何使用Composer來建立一個PHP項目
- 首先,建立一個項目目錄ComposerDemo
- 進入目錄之後,使用以上指令來擷取composer.phar,當然composer是可以全局配置,意思為不需要一個php項目下載下傳一個Composer,而是共用一個Composer
- 接下來 調用 php composer.phar init 可以自動建立一個 composer.json檔案,當然你也可以手工建立。
{
"name": "kendoctor/composer_demo",
"description": "introduction for how to use composer",
"minimum-stability": "stable",
"authors": [
{
"name": "kendoctor",
"email": "[email protected]"
}
],
"require": {
}
}
這個檔案很重要,它告訴composer如何工作。初始建立的模版,你可以修正一些你的項目的資訊。
- name ,項目名稱,命名規則,vendor名稱/項目名稱
- description,項目描述
- minium-stability,版本類型,具體内容參考官方闡述。這裡先不作探讨。
- authors,作者資訊。
- require, 這裡可以請求你項目其他的相關php類庫或類庫包
下面我們來示範Composer的第一個特性,類的自動載入
首先,按照目錄結構來建立檔案
ComposerDemo/
├── composer.phar
├── composer.json
├── src/
│ ├── models
│ ├── Calculator.php
├── index.php
檔案Calculator.php
<?php
/**
* Created by JetBrains PhpStorm.
* User: Kendoctor
* Date: 14-3-19
* Time: 上午9:39
* To change this template use File | Settings | File Templates.
*/
class Calculator {
public function addNumbers($x,$y)
{
return $x + $y;
}
}
我們要使用類Calculator,php老辦法就是require這個類檔案。事實上,我們在代碼中會調用許多類,而這些類都會放到不同的檔案中,那樣的話,我們需要許多的require。
我們知道index.php可以這麼寫
<?php
/**
* Created by JetBrains PhpStorm.
* User: kendoctor
* Date: 14-3-19
* Time: 上午9:40
* To change this template use File | Settings | File Templates.
*/
require("src/models/Calculator.php");
$calc = new Calculator();
echo $calc->addNumbers(10,21);
但是,這不是我們用了Composer想要的。我們要的效果是,執行個體某個類,它會自動載入。那,怎麼搞呢?
修改Composer.json
{
"name": "kendoctor/composer_demo",
"description": "description_text",
"minimum-stability": "stable",
"authors": [
{
"name": "author's name",
"email": "[email protected]"
}
],
"autoload":{
"classmap": ["src/"]
}
}
require這個屬性被我删除了,稍等我們再來介紹其特性。首先這裡引入一個autoload屬性,可以自動加載類或命名空間的特性屬性。classmap屬性定義要引入的哪個目錄下的類,或者直接可以是類檔案。我們這裡指定src目錄下所有的類檔案。修改之後,我們要通過composer指令來更新一下目錄結構内容,很簡單
php composer.php dump-autoload
完了會自動産生目錄vendor,裡面許多自動産生的内容,不過這裡,我們隻需要關注autoload.php這個檔案。我們在index.php隻需要引入這個檔案就可以了
<?php
/**
* Created by JetBrains PhpStorm.
* User: kendoctor
* Date: 14-3-19
* Time: 上午9:40
* To change this template use File | Settings | File Templates.
*/
require("vendor/autoload.php");
$calc = new Calculator();
echo $calc->addNumbers(10,21);
如果你又新添加了一個User到models目錄下,那你無需要做其他工作,就可以直接在index.php檔案中直接調用此類了。