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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值