使用 Composer 设置环境
Composer 是 PHP 的依赖关系管理器,深受 Node 的 NPM 和 Bundler 的启发。现在,它已成为包括 Laravel 和 Symfony 在内的多个 PHP 项目的组成部分。不过,它之所以对我们有用,是因为它包含符合 PSR-0 和 PSR-4 标准的自动加载功能。您可以从 http://getcomposer.org 下载并安装 Composer。
要在 Mac OS X 或 Linux 上全局安装 Composer,首先可以运行安装程序: |
Composer 的工作原理是使用名为 composer.json
的文件中的配置,你可以在其中列出外部依赖项和自动加载风格。一旦 Composer 安装了该文件中列出的依赖项,它就会写入一个 composer.lock
文件,详细说明已安装的确切版本。使用版本控制时,请务必提交该文件(与 composer.json
文件一起),如果使用的是 Git,请不要将其添加到 .gitignore
文件中。这一点非常重要,因为锁定文件详细记录了版本控制系统中某个特定时间安装的软件包的确切版本。不过,你可以排除一个名为 vendor
的目录,稍后我会解释它的作用。
首先,让我们在项目目录下创建一个名为 composer.json
的文件。该文件采用 JSON 结构,让我提醒一下 JSON 的工作原理:
-
JSON 由键/值对数据组成,可以把它想象成文件中定义的一组变量
-
键值对用逗号分隔,例如,"key" : "value"
-
大括号表示对象
-
方括号表示数组
-
多个数据必须用逗号分隔,数据末尾不能留有逗号
-
包含字符串的键和值必须用引号封装
-
反斜杠是转义键
现在我们可以在 composer.json
文件中添加以下标记:
{
"autoload": {
"psr-4": {
"IcyApril\\ChapterOne": "src/"
}
}
}
让我来解释一下这个文件的作用:它告诉 Composer 使用 PSR-4 标准将 src/
目录中的所有内容自动加载到 IcyApril\ChapterOne
命名空间中。
所以,下一步就是创建我们的 src
目录,在其中包含我们要自动加载的代码。完成了吗?是的,现在让我们打开命令行,进入放置 composer.json
文件的目录。
要将 composer.json
文件中的所有内容安装到项目中,只需运行 composer install
命令即可。对于后续更新,composer update
命令将更新到 composer.json
文件中定义的所有依赖项的最新版本。如果你不想这样做,也有另一种选择:运行 composer dump-autoload
命令,只需重新生成需要包含在项目中的 PSR-0/PSR-4 类的列表(例如,你添加、删除或重命名了一些类)。
现在让我介绍一下创建类的实际操作。让我们在项目中创建一个 src
目录,然后在该 src
目录中创建一个名为 Book
的新类。创建一个名为 Book.php
的文件即可。在该文件中,添加如下内容
<?php
namespace IcyApril\ChapterOne;
class Book
{
public function __construct()
{
echo "Hello world!";
}
}
这是一个标准的类,只不过我们只是定义了一个构造函数,当类实例化时,构造函数会发出 Hello world!
您可能已经注意到,我们遵循了一些命名约定;首先,PSR-1 标准声明类名必须用 StudlyCaps 来声明。PSR-2 有一些额外的要求:四个空格而不是一个制表符,命名空间或使用声明后的一个空格,以及在新行中放置括号。如果你还没有读过这些标准,绝对值得花时间读一读。你可能不同意每一个标准,你可能对如何格式化你自己的代码有主观偏好;我的建议是,为了更大的利益,把这些偏好放在一边。通过使用 PSR 标准来规范代码,在合作开发通用代码库时具有极大的优势。由 PHP-FIG 小组等组织建立的外部标准的好处是,您可以在集成开发环境中预置您的配置(例如,PHPStorm 即支持 PSR-1/PSR-2)。不仅如此,当涉及格式化争论时,您还有一份具体的公正文件来概述应该如何做,这对于在代码审查过程中阻止宗教性的代码格式化争论非常有用。
创建了类之后,我们就可以运行 composer dump-autoload
命令来刷新自动加载器脚本了。
这样,我们就配置好了 Composer 自动加载器,还创建了一个测试类,接下来的问题就是如何实现它了。那么,让我们继续实现它。在实现了 composer.json
文件的同一目录下,添加我们的 index.php
文件。
在输入 PHP 开头标签后的一行,我们需要调入自动加载器脚本:
require_once('vendor/autoload.php');
然后,我们就可以实例化 Book 类:
new \IcyApril\ChapterOne\Book();
设置好网络服务器,将文档根目录指向我们创建的文件夹,将网络浏览器指向所选的网络服务器,这时屏幕上就会出现 Hello world! 现在你可以将代码拆开来玩一玩了。
本书附有完整的代码示例,因此你可以直接打开它并进行操作,以防在调试代码时需要帮助。
无论你的类是抽象类还是纯粹的接口,在自动加载时,我们都将它们视为类。