環境:Windows 10 64位 PHP 版本:5.5.12 框架:ThinkPHP 3.2.3
Tips:
組件:打包的代碼,可以是一系列相關的類(class)、接口(interface)、特性(trait),用於解決某個具體的問題。組件中的類、接口、特性通常放在同一個命名空間中。
Packagist:https://packagist.org/,該網站收集 PHP 組件,可以在上面查找項目中需要的組件。ThinkPHP 在該站的地址為:https://packagist.org/packages/topthink/thinkphp
Composer:Composer 是 PHP 組件的依賴管理器,在命令行中運行,通過運行命令可以下載組件(以及組件的依賴)並且把組件(以及組件的依賴)自動加載到項目中。
安裝 Composer
Composer 官網地址:https://getcomposer.org/,中文鏡像地址:http://www.phpcomposer.com/
Windows 版下載地址:https://getcomposer.org/download/
下載安裝包並安裝:
如果安裝不成功且提示:
The openssl extension is missing, which will reduce the security and stability of Composer. If possible you should enable it or recompile php with --with-openssl
則需要將 php.ini 中 extension=php_openssl.dll 前面的注釋取消。
當安裝成功后,程序會自動關把安裝路徑添加到系統的環境變量,打開環境變量可以看到:
因此在 cmd 命令提示符下可以直接執行 composer 命令:
如果看到這個畫面則說明安裝成功了。
准備框架
測試使用 ThinkPHP(3.2.3) 框架(也可以使用 Laravel、Yii 等其他現代框架)。初始化的框架根目錄中,有一個 composer.json 文件:
{ "name": "topthink/thinkphp", "description": "the ThinkPHP Framework", "type": "framework", "keywords": ["framework","thinkphp","ORM"], "homepage": "http://thinkphp.cn/", "license": "Apache2", "authors": [ { "name": "liu21st", "email": "liu21st@gmail.com" } ], "require": { "php": ">=5.3.0" }, "minimum-stability": "dev" }
PHP 組件中必須要有 composer.json 文件。Composer 會使用該文件中的信息查找、安裝和自動加載 PHP 組件。
其中:
name 表示該組件的 廠商名(最頂層命名空間)和包名(字命名空間),格式是 "name": "vendor/package",vendor 表示最頂層命名空間,package 表示字命名空間
require 表示該組件依賴的組件
一會安裝了其他組件之后可以看看該文件的變化。
安裝組件
在 ThinkPHP 項目中安裝一個錯誤與異常的組件 Whoops,地址:https://packagist.org/packages/filp/whoops
項目下的 composer require filp/whoops 就是該組件在 Composer 下的安裝命令。
該組件的作用是如果 PHP 腳本中觸發了錯誤和沒有捕獲的異常,則出現 Whoops 的診斷頁面。
在命令提示符下進入項目目錄:
執行命令 composer require filp/whoops
看到以上提示說明組件安裝完成,此時查看項目目錄,發現在根目錄下會多一個 vendor 目錄:
組件 Whoops 就位於 Vendor/filp 目錄下。
此時再看根目錄下 composer.json 文件:
項目的依賴組件中多了 Whoops 組件,版本是 2.1
測試組件
在 Application/Home/Controller 下創建 TestController.class.php 文件。首先測試系統捕獲異常時的輸出:
<?php /** * Created by PhpStorm. * User: dee * Date: 2016/8/6 * Time: 12:44 */ namespace Home\Controller; use Think\Controller; class TestController extends Controller { public function index() { try { $this->division(10, 0); } catch(\Exception $e) { echo $e->getMessage(); } } function division($dividend, $divisor) { if($divisor == 0) { throw new \Exception('Division by zero'); } } }
輸出:
然后測試不加載 Whoops 組件,腳本遇到未捕獲異常時的提示:
<?php /** * Created by PhpStorm. * User: dee * Date: 2016/8/6 * Time: 12:44 */ namespace Home\Controller; use Think\Controller; class TestController extends Controller { public function index() { // 測試未捕獲的異常 $this->division(10, 0); } function division($dividend, $divisor) { if($divisor == 0) { throw new \Exception('Division by zero'); } } }
訪問:http://127.0.0.3/php/composer/thinkphp/Home/Test
輸出:
最后測試加載了 Whoops 組件,並且腳本遇到未捕獲的異常時的輸出:
<?php /** * Created by PhpStorm. * User: dee * Date: 2016/8/6 * Time: 12:44 */ namespace Home\Controller; use Think\Controller; class TestController extends Controller { public function index() { // 使用composer自動加載器 require $_SERVER['DOCUMENT_ROOT'].__ROOT__.'/vendor/autoload.php'; // 設置Whoops提供的錯誤和異常處理 $whoops = new \Whoops\Run; $whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler); $whoops->register(); // 測試未捕獲的異常 $this->division(10, 0); } function division($dividend, $divisor) { if($divisor == 0) { throw new \Exception('Division by zero'); } } }
輸出:
測試結束。
附
安裝組件的另一種方式
在 composer.json 文件中加入組件包:
例如添加組件 monolog
然后使用 composer update 命令下載組件
此時組件已經被安裝到了項目中: