搜索
首页php教程php手册【转】Composer入门,composer入门

【转】Composer入门,composer入门

Java有Maven, Node.js有npm, ROR有gem, 这些语言的程序员在开心地使用包管理工具加速开发效率时,PHPer们还在复制粘贴的黑暗中。PHP在Composer之前,包管理的历史不堪回首。

在相当长的一段时间内,如果应用依赖于第三方库,PHPer需要拷贝这些库的源代码, 或者通过PEAR、PECL安装。如果第三方库又依赖于更多的第三方库,那么很快就会进入依赖的黑洞。直到Composer出现,PHPer们看到了属于PHP的包管理的曙光。

下面将以创建一个电商网站为例,介绍Composer的使用方法。

配置文件

在我们开始一个项目的时候,首先会给项目取一个名字,我们暂且叫丝绸之路吧,代号silk。首先要写一个Composer的配置文件,来描述项目,为此,在项目的根目录下,建立文件名为composer.json的配置文件。内容如下:

<code class="hljs dust"><span class="xml"><span class="hljs-comment"><!-- lang: js -->
<span class="hljs-expression">{
<span class="hljs-string">"name":             <span class="hljs-string">"meta/silk",
<span class="hljs-string">"description":      <span class="hljs-string">"another e-commerce website",
<span class="hljs-string">"keywords":         [<span class="hljs-string">"silk", <span class="hljs-string">"online shop", <span class="hljs-string">"good"],
<span class="hljs-string">"homepage":         <span class="hljs-string">"http://www.xxx.com ",
<span class="hljs-string">"time":             <span class="hljs-string">"2014-12-30",
<span class="hljs-string">"license":          <span class="hljs-string">"MIT",
<span class="hljs-string">"authors": [
    {
        <span class="hljs-string">"name":         <span class="hljs-string">"Elvis Lim",
        <span class="hljs-string">"email":        <span class="hljs-string">"elvis@xxx.com",
        <span class="hljs-string">"homepage":     <span class="hljs-string">"http://www.xxx.com",
        <span class="hljs-string">"role":         <span class="hljs-string">"Engineer"
    }<span class="xml">
]}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

如果您熟悉JSON格式,那么上面这段内容不言而喻。事实上,这些键值对都是可选的。也就是说,可以都不写。但是如果要把项目打包成公共包发布,那么这些还是需要写上的,给你的包取个名字总不为过。让我们来过一下这些键值对的意义吧。

<code class="hljs xml"><span class="hljs-comment"><!-- lang: js -->
"name":             "meta/silk",
</span></code>

name, 表示包的名称。如果你经常在Github上混,那这个值的表达方式一定非常熟悉啦。解释下,通常包名包含两部分,并且以 / 分隔。斜杆前面部分,代表包的所有者。目前大部分的包作者都喜欢用Github的用户名作为这部分的值。斜杆后面部分代表包的名称。尽量保持简单和有意义 些,便于记忆和传播。大部分情况下,很多人会用Github的代码库名称来命名,当然,这种情况下,代码要存在Github比较有意义。

<code class="hljs xml"><span class="hljs-comment"><!-- lang: js -->
"description":      "another e-commerce website",
</span></code>

应用简介,这部分尽量简洁介绍下项目,别长篇大论。如果确实有很多话要说,那么可以写在README.md文件里。

<code class="hljs xml"><span class="hljs-comment"><!-- lang: js -->
"keywords":         ["silk", "online shop", "good"],
</span></code>

关键词的值是一个字符串数组,在发布成公用库的是时候,作为元数据信息,有利于包的搜索和发现。

<code class="hljs xml"><span class="hljs-comment"><!-- lang: js -->
"homepage":         "http://www.xxx.com ",
</span></code>

主页,可以放你想放的任何页面地址。

<code class="hljs xml"><span class="hljs-comment"><!-- lang: js -->
"license": "MIT",
</span></code>

如果你决定将包公开发布,那么记得选择一个合适的许可证。这样别的程序员在引用包的时候,通过查看许可证,确保没有法律上的问题。

<code class="hljs xml"><span class="hljs-comment"><!-- lang: js -->
 "authors":[{}]
</span></code>

作者字段可以包含一个对象数组,也就是说可以提供多个作者信息。

目前为止,都是关于包本身的信息描述。作为一个电商网站,能够发送电子邮件、导出订单到Excel表是基本需求,这个时候自然想到了使用现有的库来 实现这些功能。要获取这些库,最简单的方式是,搜索下这些库,找到下载地址,下载个zip包,然后解压到相应目录下,根据文档引入相应的文件。使用 Composer,可以更加自动和优雅地完成这个过程,这就是Composer的依赖管理。

依赖管理

在composer.json文件里增加一个新的字段:require。这个字段的值是一个对象,同样以键值对的形式构成。以上述提到的两个依赖位置,写成composer管理的方式如下:

<code class="hljs dust"><span class="xml"><span class="hljs-comment"><!-- lang: js -->
&ldquo;require&rdquo;: <span class="hljs-expression">{
<span class="hljs-string">"swiftmailer/swiftmailer": 5<span class="hljs-variable">.3<span class="hljs-variable">.*@<span class="hljs-variable">dev,
<span class="hljs-string">"phpoffice/phpexcel": <span class="hljs-string">"dev-master"
}</span></span></span></span></span></span></span></span></span></code>

以swiftmailer为例,swiftmailer/swiftmailer 代表的是包名称,5.3.@dev , 是版本信息。合起来的意思就是说,我们将要开发的应用,依赖于swiftmailer的5.3.版本。其中:

5.3.*表示,可以使用5.3.1版本,也可以使用5.3.2版本,composer在获取的时候,将寻找5.3版本下最新的版本。版本号支持一 些更加宽泛的约束,比如>=1.0, >=1.0,

@dev表示可以获取开发版本。通常,开发版本意味非稳定版本,很可能存在bug。稳定性标签可以作用于特定的依赖项,也可以作用于全局。

作用特定依赖项:默认情况下,composer只会获取稳定版本,如果这个例子我们不加@dev约束,而5.3.*版本都是开发版本,那么在获取的时候composer就会报错,指出改版本不符合要求。如果确定这个开发版本没有问题,那么就可以通过加@dev ,让Composer获取这个开发版本。

全局稳定性设置:通过设置minimum-stability的值,来告诉Composer当前开发的项目的依赖要求的包的全局稳定性级别,它的值包括:dev、alpha、beta、RC、stable,stable是默认值。

至此,两个依赖添加完毕,我们可以运行下Composer包更新命令,看看效果啦。

<code class="hljs xml"><span class="hljs-comment"><!-- lang: shell -->
composer install
</span></code>

成功运行完毕,会在根目录下发现vendor文件夹,里面包含了刚刚我们列出来的两个包文件代码。

require-dev

有时候,我们会发现,有些包依赖只会在开发过程中使用,正式发布的程序不需要这些包,这个时候,就需要用到另外一个键,即require-dev。例如,我们想用codeception进行单元测试,那么就可以通过require-dev引入这个开发环境下的依赖包:

<code class="hljs dust"><span class="xml"><span class="hljs-comment"><!-- lang: js -->
&ldquo;require-dev&rdquo;: <span class="hljs-expression">{
<span class="hljs-string">"codeception/codeception": <span class="hljs-string">"2.0.0 "
}</span></span></span></span></span></code>

加了这个依赖后,再运行下命令看看效果。

<code class="hljs xml"><span class="hljs-comment"><!-- lang: shell -->
composer install
</span></code>

自动加载

自此,composer已经帮我们把需要的库文件下载下来啦,接下去想到的就是如何引用这些库文件。最简单的方式就是require或者 include,但这就不够高大上了啊,需要花时间去库文件里查看需要引入哪些文件,费事而且容易出错。好在composer可以帮我们解决这个问题。那 就是autoload。

在运行完composer install命令后,怎么调用PHPExcel库呢?很简单,只要引入vendor目录下的autoload.php文件就可以了。可以在根目录下,建一个index.php文件,加入一下内容:

<code class="hljs php">
<span class="hljs-keyword">include &ldquo;vendor/autoload.php&rdquo;
<span class="hljs-variable">$excel = <span class="hljs-keyword">new PHPExcel();
var_dump(<span class="hljs-variable">$excel);
</span></span></span></span></code>

用浏览器访问一下这个页面,就会发现PHPExcel对象已经被成功创建啦,是不是很方便?

其实到目前为止,我们并没用在composer.json文件里加入autoload字段,那么什么时候需要加入呢? 那就是当我们想让composer帮我们自动加载我们自己定义的类的时候。例如,我们自己写了个订单管理类,取名OrderManager,放在lib目 录下的OrderManager.php文件里。内容如下:

<code class="hljs php">
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">OrderManager
{
    <span class="hljs-keyword">public <span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">test<span class="hljs-params">()
    {
        <span class="hljs-keyword">echo <span class="hljs-string">"hello";
    }
}
</span></span></span></span></span></span></span></span></span></span></code>

那么如何让composer帮我们自动加载这个类呢? 在composer.json里加入下面的内容:

<code class="hljs dust"><span class="xml"><span class="hljs-comment"><!-- lang: js -->
&ldquo;autoload&rdquo;:<span class="hljs-expression">{
    <span class="hljs-string">"files":[<span class="hljs-string">"lib/OrderManager.php"]
}</span></span></span></span></span></code>

files键对应的值是一个数组,数组元素是文件的路径,路径是相对于应用的根目录。加上上述内容后,运行命令:

<code class="hljs xml"><span class="hljs-comment"><!-- lang: js -->
composer dump-autoload
</span></code>

让composer重建自动加载的信息,完成之后,就可以在index.php里调用OrderManager类啦。

通过文件引入的方法虽然直观,但是很费劲,每个文件都得引入一次,实在不是好的解决办法。有没有更好的办法呢?尝试将autoload的值改成:

<code class="hljs xml"><span class="hljs-comment"><!-- lang: js -->
 "classmap":["lib"]
</span></code>

再此运行composer dump-autoload,尝试调用,依然能够成功创建OrderManager类。其实,classmap通过建立类到文件的对应关系,当程序需要 OrderManager类时,compoer的自动加载类通过查找OrderManager类所在的文件,然后再将改文件include进来。因此,这 又导致了一个问题,那就是每加一个新类,就需要运行一次composer dump-autoload来创建类到文件到对应关系,比files方法虽然好一点,但是还是很不够舒爽啊!于是,PSR-0出场了。先了解下什么是 PSR-0。

FIG组织制定的一组PHP相关规范,简称PSR,其中

PSR-0自动加载
PSR-1基本代码规范
PSR-2代码样式
PSR-3日志接口
PSR-4 自动加载

目前就这五个规范,乍一看,PSR-0和PSR-4是重复了,实际上,在功能上确实有所重复。区别在于PSR-4的规范比较干净,去除了兼容PHP 5.3以前版本的内容,有一点PSR-0升级版的感觉。当然,PSR-4也不是要完全替代PSR-0,而是在必要的时候补充PSR-0——当然,如果你愿 意,PSR-4也可以替代PSR-0。PSR-4可以和包括PSR-0在内的其他自动加载机制共同使用。

PSR-0规范的具体内容见:https://github.com/hfcorriez/fig-standards/blob/zh_CN/%E6%8E%A5%E5%8F%97/PSR-0.md
PSR-4规范的具体内容见:https://github.com/hfcorriez/fig-standards/blob/zh_CN/%E6%8E%A5%E5%8F%97/PSR-4-autoloader.md

简而言之,就是希望通过一组约定的目录,文件名,类名定义方式,来实现快速通过类查找到文件,然后包含进来,实现自动加载。
PSR-4和PSR-0最大的区别是对下划线(underscore)的定义不同。PSR-4中,在类名中使用下划线没有任何特殊含义。而PSR-0则规定类名中的下划线_会被转化成目录分隔符。

不管是PSR-0还是PSR-4,都要求有个命名空间,所以我们需要对OrderManager类进行一些小的修改,加上命名空间:

<code class="hljs php">
<span class="hljs-keyword">namespace <span class="hljs-title">SilkLib;
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">OrderManager
{
    <span class="hljs-keyword">public <span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">test<span class="hljs-params">()
    {
        <span class="hljs-keyword">echo <span class="hljs-string">"hello";
    }
 }
</span></span></span></span></span></span></span></span></span></span></span></span></code>

同时,文件夹的结构也要修改成:应用根目录\lib\SilkLib\OrderManager.php

然后修改composer.json里的autoload部分如下:

<code class="hljs dust"><span class="xml"><span class="hljs-comment"><!-- lang: js -->
"autoload":<span class="hljs-expression">{
    <span class="hljs-string">"psr-0":{
        <span class="hljs-string">"SilkLib":<span class="hljs-string">"lib/"
    }<span class="xml">
}
</span></span></span></span></span></span></span></code>

这里需要注意的是,SlikLib是命名空间,lib是目录名,他们的组合告诉composer,文件搜索是在:lib/SilkLib/ 目录下,而不是在 SilkLib/lib 目录下,这一点要特别注意,有点绕,容易弄错。

如果我们把命名空间改成 Slik\lib, 相应的目录结构要改成:应用根目录\lib\Silk\lib\OrderManager.php,autoload部分的写法相应的也要改成:

<code class="hljs dust"><span class="xml"><span class="hljs-comment"><!-- lang: js -->
"autoload":<span class="hljs-expression">{
    <span class="hljs-string">"psr-0":{
        <span class="hljs-string">"Silk\\lib":<span class="hljs-string">"lib/"
    }<span class="xml">
}
</span></span></span></span></span></span></span></code>

注意Silk\lib是双斜杆。好了,那我们试试再加一个类,然后不用运行composer dump-autoload命令,看看新类是否能加载上。在lib目录下,新增一个ShipManager.php文件,内容如下:

<code class="hljs php">
<span class="hljs-keyword">namespace <span class="hljs-title">Silk\<span class="hljs-title">lib;
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">ShipManager
{
    <span class="hljs-keyword">public <span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">test<span class="hljs-params">()
    {
        <span class="hljs-keyword">echo <span class="hljs-string">'hello ship class';
    }
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></code>

尝试在index.php文件中调用:

<code class="hljs lasso">
<span class="hljs-variable">$orderMgr <span class="hljs-subst">= <span class="hljs-literal">new Silk<span class="hljs-subst">\lib<span class="hljs-subst">\OrderManager();
<span class="hljs-variable">$orderMgr<span class="hljs-subst">->test();
<span class="hljs-variable">$shipMgr <span class="hljs-subst">= <span class="hljs-literal">new Silk<span class="hljs-subst">\lib<span class="hljs-subst">\ShipManager();
<span class="hljs-variable">$shipMgr<span class="hljs-subst">->test();
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

运行成功,说明使用psr-0规范进行自动加载,比classmap更加方便。下面试试psr-4方式,整理下目录结构,改成:应用根目录\lib\OrderManager.php,修改命名空间为Silk, 修改autoload部分为:

<code class="hljs 1c">
<span class="hljs-string">"autoload":{
    <span class="hljs-string">"psr-4":{
        <span class="hljs-string">"Silk":<span class="hljs-string">"lib"
    }
}
</span></span></span></span></code>

尝试调用,发现报错Fatal error: Uncaught exception 'InvalidArgumentException' with message 'A non-empty PSR-4 prefix must end with a namespace separator. 提示要加上分隔符,那就加上吧:

<code class="hljs dust"><span class="xml"><span class="hljs-comment"><!-- lang: js -->
"autoload":<span class="hljs-expression">{
    <span class="hljs-string">"psr-4":{
        <span class="hljs-string">"Silk\\":<span class="hljs-string">"lib"
    }<span class="xml">
}
</span></span></span></span></span></span></span></code>

再次composer dump-autoload,运行测试,OK通过!

掌握require和autoload部分,其实就算Compoer入门啦,在详细的内容,可以通过查看composer文档来了解。Happy Coding!

原文转于:http://my.oschina.net/u/248080/blog/359008

感谢原著

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
四大步教你在Debian11上安装使用Composer!四大步教你在Debian11上安装使用Composer!Nov 08, 2022 pm 04:32 PM

本文由composer​教程栏目给大家介绍关于在Debian11上是怎么一步步安装,以及使用Composer的 ,非常详细哦~希望对需要的朋友有所帮助!

Composer是啥Composer是啥Dec 25, 2023 pm 03:06 PM

Composer是PHP的依赖管理工具,它允许开发者将第三方库和框架与自己的项目进行集成。它的主要功能包括:1、依赖管理;2、版本控制;3、自动加载;4、扩展开发;5、集成其他工具。它简化了PHP项目的依赖管理过程,确保项目的稳定性和可维护性。通过使用Composer,开发者可以更加高效地管理自己的项目和集成第三方库和框架。

composer 怎么修改php路径composer 怎么修改php路径Oct 24, 2022 am 11:33 AM

composer修改php路径的方法:1、搜索“composer.bat”并复制到项目文件夹;2、编辑“composer.bat”,将内容修改为“@ECHO OFF php "%~dp0composer.phar" %*”即可。

PHP使用Composer安装和管理依赖包PHP使用Composer安装和管理依赖包Jun 18, 2023 pm 03:30 PM

在PHP开发中,我们经常要处理各种依赖包,这些依赖包可能是其他开发者编写的PHP库文件,也可能是一些第三方工具和框架。为了方便管理这些依赖包,我们可以使用Composer来进行相关的安装和管理工作。Composer是一个开源的PHP依赖管理工具,它可以帮助我们自动化安装、更新和卸载PHP依赖包。通过Composer,我们可以轻松地管理我们应用中的不同依赖,同

电脑关机很慢一直在转怎么办电脑关机很慢一直在转怎么办Feb 21, 2024 pm 12:42 PM

电脑是我们日常生活和工作中必不可少的工具之一,但有时候我们会遇到一些问题,比如电脑关机很慢,一直转圈。这种情况在许多人中间很常见,但是对于很多人来说,却不知道该怎么办。首先,我们需要了解一下电脑关机慢的原因。有几个可能的原因会导致这个问题出现。首先,可能是电脑中有一些正在运行的程序或者进程没有关闭,导致电脑关机的时候需要等待这些程序或者进程关闭才能成功关机。

使用Composer和PHP包管理器的最佳实践使用Composer和PHP包管理器的最佳实践May 23, 2023 am 08:29 AM

随着PHP的日益流行,PHP开发人员面临着许多挑战,其中包括代码管理、可重用性和依赖性管理。这些问题可以使用包管理器来解决,而Composer是PHP最受欢迎的包管理器之一。在本文中,我们将探讨使用Composer和PHP包管理器的最佳实践,从而提高您的PHP开发效率和代码质量。何为Composer?Composer是一款PHP包管理器,它可以轻松管理PHP

创建composer项目的步骤创建composer项目的步骤Feb 19, 2024 pm 07:13 PM

Composer是一个PHP的依赖管理工具,可以帮助开发者有效地管理项目中的依赖关系。通过Composer,我们可以轻松地引入第三方库、框架以及其他项目所需的各种资源。创建一个Composer项目非常简单,只需按照以下步骤进行操作:首先需要确保在本地已经安装了Composer。可以在终端中运行composer-v命令来确认是否已经安装成功。在项目的根目录中

什么是Composer,它与PHP的关系是什么?什么是Composer,它与PHP的关系是什么?May 12, 2023 pm 08:31 PM

随着现代Web开发技术的迅速发展,依赖管理成为了一个越来越重要的议题。无论是前端还是后端开发,我们需要引入各种各样的库和框架来达到更高的开发效率和更好的应用性能。而这些库和框架的组织、版本控制和安装管理问题则成为了一个值得思考和解决的难题。Composer就是为了解决PHP应用开发中依赖管理问题而推出的一个开源工具。它的作用类似于Node.js

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具