这是一篇社区协同翻译的文章,已完成翻译,更多信息请点击 协同翻译介绍 。
讨论请前往:https://laravel-china.org/topics/8690
文章的标题真是自命不凡,不是吗?是的,虽然我们使用 PHP 工作很多年,但是我们能够说出哪些是最佳实践和最好的工具吗?我不能,但是我将要去这么做。
我看到开发者们使用 PHP 工作的方式正在发生真正的变化,不仅因为 PHP 新的版本和自身逐步的完善,让 PHP 语言发生了巨大变化,变得更加成熟和健壮,更重要的是整个生态系统也在不断地改变。
为了使代码更优雅和更易于理解,人们创造了新的工具、库、框架和文章,定义了新的设计模式。一些人还在思考如何让工作(和开发者的生活)变得更具生产力,更简洁和更有趣。
我不是一个新趋势的早期追随者,实际上,我只会在一个新工具有了社区和我认为它能改善我的工作后才会去使用它。我经常做的仅仅是尝试采用最佳实践来写代码。
所以,我花了一段时间以后才开始使用 Composer 和 PHPUnit 等工具。大约一年以前,我才向这些闪亮的新事物敞开了心扉。
先是 PSR,然后是 Composer,PHPUnit,Travis-ci 等其他几个库和令人惊奇的工具。我甚至已经开始使用 IDE 了(Vim FTW,但是配置了 XDebug 的 PHPStorm 才是一个明智的工作环境)!
什么是现代化?
作者: Karen Roe (Flickr) [CC BY 2.0 (http://creativecommons.org/licenses/by/2.0)]
网上有大量的文章说 PHP 多么可怕,从事 PHP 编码工作会让你的生活多么糟糕,语言是多么丑陋以及你能想到的任何其他东西!
如果你打算使用遗留代码,可能你的生活不会太好,但是如果你有机会参与一个新的项目并且能够使用所有的新工具,那么你将会看到我要讲的这个新的 PHP 。
我每天都会用 PHP 处理一些问题,但是人们无法关注语言、社区以及生态系统所发生的变化 。虽然还有很长的路要走,但是 PHP 领域的事情正在变得越来越成熟。
我开始为我工作的公司创建一个内部 API 的 SDK,例如一个宠物项目,并且决定遵循最佳实践。大部分事件我已经在做了,但是我在做某些事情的时候做了一些改变。这些改变以及我去年学到的知识是本文的主题,我称之为现代化 PHP 。
我们从工作流程开始
如我所说,我刚刚使用 IDE 没有多久,但是自从用上了 IDE ,我就喜欢上了。PHPStorm 是软件中的顶级杰作。它将会是我的第一个也是此后唯一一个 IDE 。它是我的首次尝试,它好到我没有必要再去尝试其他的IDE。
集成的 XDebug 简直完美,还有 PHP 命名空间解析、 composer 、git 、代码自动补全、代码生成、代码重构。让我说三天三夜都说不完。
我不认为你必须使用 IDE ,实际上,这完全是个人观点。你需要使用诸如此类的符合你的需求的,例如:Vim 、Atom 、Emacs 、Bracket 、NetBeans 、 PHPStorm 、Eclipse ,等等。很重要的两点是生产力与人体工学。你的 IDE 或文本编辑器必须是协助你工作的,而不是拖累你。
然而,对于我来说,很重要的一点是对于调试功能的集成。写一个大型项目(其实小项目也一样)你需要一个很好的调试工具。让我们忘掉那些
var_dump
和
print_r
。你需要在代码运行时设置变量的值、分析堆栈、设置断点。 这些才是至关重要的,它们使得开发和重构更加容易。
我甚至不知道是否还有其他的选择,XDebug 拥有你所需要的一切。你现在有时间吗?如果你还没有做过这些事情,请花一点时间安装 XDebug 并把它整合到你的 IDE 里吧。从现在开始使用正确的工具来调试你的代码。
另一个我想让你引起注意的工具是 Github。可以写一大篇文章来介绍 Git 和 Github 有多棒,以及你为什么必须开始使用版本控制来管理你的代码,但此处我想为你展示另一个原因。
这里的重点就是 integration (GitHub Integration(http://docs.smartthings.com/en/latest/tools-and-ide/github-integration.html),译者注)。
Github 中还整合了其他几个工具,并且你应该开始使用它们。在持续化集成过程中,这些工具可以为你生成数据,跑测试,跑任务,在你的工作流中为你做各种各样的事情。Integration 是你开始使用 Github 的一个很好的理由,其他的事情都可以暂时靠边站。
依赖管理
现代 PHP 生态的另一点就是依赖管理,Composer 也由此而生。
Composer 已经5岁了,但大规模应用还是近两年的事。这大概是我没有及早使用,或多数 PHP 开发者流连现状造成的。
它是 Packagist 的终端,而 Packagist 是 PHP 包的仓库,由 PHP 库、项目以及工具组成,源码保存在 Github (或 BitBucket 等)。
本文谈及的所有第三方库,都可以轻松地添加到你的项目中。
$ composer require package_vendor/package_name
要是不知道第三方库的名称,可以使用
search
查找。
$ composer search package_name
Composer 是管理依赖的不二之选,但绝不仅于此。不妨花点时间安装 Composer,阅读其 文档(https://getcomposer.org/doc/)。
处理得当的命令行界面
我真的愿意尝试快速使用 CLI 界面的想法。对我而言,最伟大的 REPL 工具是 IPython(https://ipython.org/)。该工具可自动完成你的代码,让你轻松定义函数,悠闲地访问文档,还有其他的多个惊艳的特性。对我们不利的是,该工具用于 Python 而非 PHP。
PHP 世界里有种称之为 “互动模式” 的东西,可以通过终端工具访问,只需键入以下代码:
$ php -a
Interactive mode enabled
php >
本场景中即处于互动模式,能着手一些东西的测试。该模式很管用,不过太不直观了。我还是卖力地尝试了几次,由于我知道 IPython 的本事,因此令我根本不会继续用这个模式。
幸运的是,存在一款全新酷炫的 CLI (命令行界面) 工具,名叫 Psysh。 Psysh 是一款令人惊艳的工具,充满了引人注目的特性,可以全局安装,也可使用 composer 按项目安装。
对我而言最棒的 Psysh 特性就是内嵌文档功能。直接查询一个PHP函数的文档而无须跑到 Php.net 网站上,简直棒极了。 缺点是你在享用所有功能前还必须完成几件事。
该工具安装完毕后,为正确运行就要输入以下命令(我这里用的是 Debian ,未必适合所有人) :
$ apt-get install php7.1-sqlite3
$ mkdir /usr/local/share/psysh
$ wget <http://psysh.org/manual/en/php_manual.sqlite> -o /usr/local/share/psysh/php_manual.sqlite
第一条命令并不是强制性的并且如果你已经安装了 Sqlite 你可以跳过这一步。第二个命令创建目录来存储文档而第三条命令下载并将文档保存到先前创建的目录中。记住,所有这些命令都必须以
root
身份运行。
现在你有了这些:
psysh
指令文档说明的截图,显示关于
json_decode
的信息。
点击此链接前往 Psysh(http://psysh.org/) 了解更多关于这个炫酷的工具。
你应该开始测试
这是我每天对自己说的咒语。像很多人一样,我没有按照 TDD 的建议去测试代码。我现在已经养成测试习惯,并且已经持续了半年,然而还有很长的路要走。
当我面对一个复杂的遗留项目时,我决定学习测试。那个项目代码如此奇葩,以至于任何时间我添加一些代码都会出问题。 用新特性? 实现功能和制造问题!修改一个bug? 还是创建一个新的吧。
那是一个大问题,我在另一篇,并且是我开始尝试使用测试。
我想推荐的第一个工具是 PHPUnit。 正如官网展示的:
PHPUnit 是一个面向程序员的PHP测试框架
PHPUnit 是一个实例 xUnit 架构的单元测试框架
所以,PHPUnit 是一个为你的项目生成统一测试的框架,它会提供一些函数去测试你的代码并且有漂亮的结果输出。
自从我开始考虑测试,阅读和与人交谈它,我发现另一个很棒的工具,它会补充你在这些统一测试中的工作。它就是 Behat,一个 PHP 的 BDD 框架。
BDD(行为驱动开发)是来自 TDD(测试驱动开发)的开发过程。这些缩略词现在不重要,重要的是您可以使用更自然的语言来指定您的测试,这是非技术人员可以理解的语言。
这个语言被称为 Gherkin,用于描述正在测试的预期行为,使用 Gherkin的测试描述,如下所示:
在这些行后面有 PHP 代码,只有在该方法的 PhpDoc 中指定的行和正则表达式之间存在匹配,就会调用该代码。该代码使用你的 SDK、应用程序或者 web 系统实现这些步骤以及真正的用户将执行的操作
Behat 的工作流程十分流畅。在一切正确配置之后,你就可以开始编写测试功能的所有可能方案。当你首次运行 Behat 时,它会提供你所有那些你应该添加到 PHP Context 类中的方法模板以便实现场景中的每一个步骤。
在那之后,你就可以为每一个步骤编写实际代码并重复此循环。
-
为每一个步骤编写 PHP 代码
-
运行测试
-
如果一切正常,为其它步骤编写 PHP 代码
-
如果有地方出了问题,修复它
在配置和阅读文档半小时后,你可以准备使用 Behat,到最后你会发现全都是 PHP 代码并且已经发现你已经知道如果使用它编程。
持续集成
持续集成( CI ) 是一个过程,它提供一个为软件工程师创建软件的一个方法。
简单的说,它就是经常(可能一天几次)将小块代码整合进基础代码当中的行为。代码已经测试过且不会出现突发情况。CI 帮我我们自动构建,测试和部署到我们的应用中。
只要几次点击,就可以将你的 Github 的项目集成到 Travis CI 中之后你每次将代码推送到仓库,它会运行你创建的 PHPUnit 和 Behat 文件,并告诉你最近的功能是否已经准备,或没有,或将要被合并。除此之外,你可以使用 Travis CI 将你的代码部署到生产环境中运行。