天天看點

結合Composer 新版本PHP的開發方式一、PHP的一些臭曆史二、初體驗Composer

一、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項目

  1. 首先,建立一個項目目錄ComposerDemo
  2. 進入目錄之後,使用以上指令來擷取composer.phar,當然composer是可以全局配置,意思為不需要一個php項目下載下傳一個Composer,而是共用一個Composer
  3. 接下來 調用 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檔案中直接調用此類了。