composer概述及自動加載

原文地址:http://www.cnblogs.com/leonkao/p/laravel-composer.html

Composer概述及其自動加載探祕
composer概述

一開始,最吸引我的當屬 Composer 了,因爲之前從沒用過 Composer 。

Composer 是PHP中用來管理依賴關係的工具,你只需在自己的項目中聲明所依賴的外部工具庫,Composer就會幫你安裝這些依賴的庫文件。運行 Composer 需要 PHP 5.3.2+ 以上版本。

使用composer

第一步,聲明依賴關係。比方說,你正在創建的一個項目需要一個庫來做日誌記錄。你決定使用 monolog。爲了將它添加到你的項目中,你所需要做的就是創建一個 composer.json 文件,其中描述了項目的依賴關係。

{
“require”: {
“monolog/monolog”: “1.2.*”
}
}
第二步,使用composer。在項目根目錄,執行安裝命令,執行完畢後,monolog就會被下載到vendor/monolog/monolog 目錄。

$ php composer.phar install
第三步,類的自動加載。除了庫的下載,Composer 還準備了一個自動加載文件,它可以加載 Composer 下載的庫中所有的類文件。使用它,你只需要將下面這行代碼添加到你項目的引導文件中:

require ‘vendor/autoload.php’;
這使得你可以很容易的使用第三方代碼。例如:如果你的項目依賴 monolog,你就可以像這樣開始使用這個類庫,並且他們將被自動加載。

log=newMonolog\Logger(name); log->pushHandler(new Monolog\Handler\StreamHandler(‘app.log’, Monolog\Logger::WARNING));

$log->addWarning(‘Foo’);

Composer 自動加載探祕

在現實世界中使用工具時,如果理解了工具的工作原理,使用起來就會更加有底氣。對於一個第一次接觸laravel,且是第一次接觸 composer 的新手來說,如果理解Composer 是如何工作的,使用起來將會更加自如。

我的理解是,composer 根據聲明的依賴關係,從相關庫的 源 下載代碼文件,並根據依賴關係在 Composer 目錄下生成供類自動加載的 PHP 腳本,使用的時候,項目開始處引入 “/vendor/autoload.php” 文件,就可以直接實例化這些第三方類庫中的類了。那麼,Composer 是如何實現類的自動加載的呢?接下來,我們從 laravel 的入口文件開始順藤摸瓜往裏跟進,來一睹 Composer 自動加載的奧妙。

1.代碼清單 laravel/public/index.php

複製代碼

laravel/public/index.php

require DIR.’/../bootstrap/autoload.php’;

$app = require_once DIR.’/../bootstrap/start.php’;

$app->run();
複製代碼
第一行先是引入了 laravel/bootstrap/autoload.php,不做解釋,打開該文件。

2.代碼清單 laravel/bootstrap/autoload.php

複製代碼
define(‘LARAVEL_START’, microtime(true));
require DIR.’/../vendor/autoload.php’;
if (file_exists($compiled = DIR.’/compiled.php’))
{
require $compiled;
}
Patchwork\Utf8\Bootup::initMbstring();
複製代碼
第一行定義了程序開始執行的時間點。緊接着第二行,引入了 laravel/vendor/autoload.php。

第七行,前面說過,引入Composer的autoload.php之後就可以直接使用第三方類庫中的類了,這裏就是直接使用的 Bootup 類。下面來看看 /vendor/autoload.php 到底做了什麼。

3.代碼清單 laravel/vendor/autoload.php

1 // autoload.php @generated by Composer
2
3 require_once DIR . ‘/composer’ . ‘/autoload_real.php’;
4
5 return ComposerAutoloaderInit9b2a1b1cf01c9a870ab98748dc5f1256::getLoader();
到這裏,馬上就進入自動加在的大門了。

這個文件很簡單,第5行的函數名是不是看的一頭霧水?別被嚇到了,他就是個類名而已。這個類是在第3行引入的文件 laravel/vendor/composer/autoload_real.php 裏頭聲明的,接下來打開該文件看 getLoader();

4.代碼清單laravel/vendor/composer/autoload_real.php

複製代碼
1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章