看吧,这就是现代化 PHP 该有的样子

文章的标题真是自命不凡,不是吗?是的,虽然咱们使用 PHP 工做不少年,可是咱们可以说出哪些是最佳实践和最好的工具吗?我不能,可是我将要去这么作。php

我看到开发者们使用 PHP 工做的方式正在发生真正的变化,不只由于 PHP 新的版本和自身逐步的完善,让 PHP 语言发生了巨大变化,变得更加成熟和健壮,更重要的是整个生态系统也在不断地改变。html

为了使代码更优雅和更易于理解,人们创造了新的工具、库、框架和文章,定义了新的设计模式。一些人还在思考如何让工做(和开发者的生活)变得更具生产力,更简洁和更有趣。python

我不是一个新趋势的早期追随者,实际上,我只会在一个新工具备了社区和我认为它能改善个人工做后才会去使用它。我常常作的仅仅是尝试采用最佳实践来写代码。git

因此,我花了一段时间之后才开始使用 Composer 和 PHPUnit 等工具。大约一年之前,我才向这些闪亮的新事物敞开了心扉。程序员

先是 PSR,而后是 Composer,PHPUnit,Travis-ci 等其余几个库和使人惊奇的工具。我甚至已经开始使用 IDE 了(Vim FTW,可是配置了 XDebug 的 PHPStorm 才是一个明智的工做环境)!github

什么是现代化?

 

 
图1:看吧,这就是现代化 PHP 该有的样子

 

做者: Karen Roe (Flickr) [CC BY 2.0 (http://creativecommons.org/licenses/by/2.0)]web

网上有大量的文章说 PHP 多么可怕,从事 PHP 编码工做会让你的生活多么糟糕,语言是多么丑陋以及你能想到的任何其余东西!正则表达式

若是你打算使用遗留代码,可能你的生活不会太好,可是若是你有机会参与一个新的项目而且可以使用全部的新工具,那么你将会看到我要讲的这个新的 PHP 。sql

我天天都会用 PHP 处理一些问题,可是人们没法关注语言、社区以及生态系统所发生的变化 。虽然还有很长的路要走,可是 PHP 领域的事情正在变得愈来愈成熟。编程

我开始为我工做的公司建立一个内部 API 的 SDK,例如一个宠物项目,而且决定遵循最佳实践。大部分事件我已经在作了,可是我在作某些事情的时候作了一些改变。这些改变以及我去年学到的知识是本文的主题,我称之为现代化 PHP 。

咱们从工做流程开始

 

 
图2:看吧,这就是现代化 PHP 该有的样子

 

如我所说,我刚刚使用 IDE 没有多久,可是自从用上了 IDE ,我就喜欢上了。PHPStorm 是软件中的顶级杰做。它将会是个人第一个也是此后惟一一个 IDE 。它是个人首次尝试,它好到我没有必要再去尝试其余的IDE。

集成的 XDebug 简直完美,还有 PHP 命名空间解析、 composer 、git 、代码自动补全、代码生成、代码重构。让我说三天三夜都说不完。

我不认为你必须使用 IDE ,实际上,这彻底是我的观点。你须要使用诸如此类的符合你的需求的,例如:Vim 、Atom 、Emacs 、Bracket 、NetBeans 、 PHPStorm 、Eclipse ,等等。很重要的两点是生产力与人体工学。你的 IDE 或文本编辑器必须是协助你工做的,而不是拖累你。

然而,对于我来讲,很重要的一点是对于调试功能的集成。写一个大型项目(其实小项目也同样)你须要一个很好的调试工具。让咱们忘掉那些var_dumpprint_r。你须要在代码运行时设置变量的值、分析堆栈、设置断点。 这些才是相当重要的,它们使得开发和重构更加容易。

我甚至不知道是否还有其余的选择,XDebug 拥有你所须要的一切。你如今有时间吗?若是你尚未作过这些事情,请花一点时间安装 XDebug 并把它整合到你的 IDE 里吧。从如今开始使用正确的工具来调试你的代码。

另外一个我想让你引发注意的工具是 Github。能够写一大篇文章来介绍 Git 和 Github 有多棒,以及你为何必须开始使用版本控制来管理你的代码,但此处我想为你展现另外一个缘由。

这里的重点就是 integration (GitHub Integration,译者注)。

Github 中还整合了其余几个工具,而且你应该开始使用它们。在持续化集成过程当中,这些工具能够为你生成数据,跑测试,跑任务,在你的工做流中为你作各类各样的事情。Integration 是你开始使用 Github 的一个很好的理由,其余的事情均可以暂时靠边站。

依赖管理

 

 
图3:看吧,这就是现代化 PHP 该有的样子

 

现代 PHP 生态的另外一点就是依赖管理,Composer 也由此而生。

Composer 已经5岁了,但大规模应用仍是近两年的事。这大概是我没有及早使用,或多数 PHP 开发者流连现状形成的。

它是 Packagist 的终端,而 Packagist 是 PHP 包的仓库,由 PHP 库、项目以及工具组成,源码保存在 Github (或 BitBucket 等)。

本文谈及的全部第三方库,均可以轻松地添加到你的项目中。

$ composer require package_vendor/package_name

要是不知道第三方库的名称,可使用 search 查找。

$ composer search package_name

Composer 是管理依赖的不二之选,但毫不仅于此。不妨花点时间安装 Composer,阅读其 文档

处理得当的命令行界面

我真的愿意尝试快速使用 CLI 界面的想法。对我而言,最伟大的 REPL 工具是 IPython。该工具可自动完成你的代码,让你轻松定义函数,清闲地访问文档,还有其余的多个惊艳的特性。对咱们不利的是,该工具用于 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 身份运行。

如今你有了这些:

 

 
图4:看吧,这就是现代化 PHP 该有的样子

 

psysh 指令文档说明的截图,显示关于 json_decode 的信息。

点击此连接前往 Psysh 了解更多关于这个炫酷的工具。

你应该开始测试

这是我天天对本身说的咒语。像不少人同样,我没有按照 TDD 的建议去测试代码。我如今已经养成测试习惯,而且已经持续了半年,然而还有很长的路要走。

当我面对一个复杂的遗留项目时,我决定学习测试。那个项目代码如此奇葩,以致于任什么时候间我添加一些代码都会出问题。 用新特性? 实现功能和制造问题!修改一个bug? 仍是建立一个新的吧。

那是一个大问题,我在另外一篇,而且是我开始尝试使用测试。

我想推荐的第一个工具是 PHPUnit。 正如官网展现的:

PHPUnit 是一个面向程序员的PHP测试框架
PHPUnit 是一个实例 xUnit 架构的单元测试框架

因此,PHPUnit 是一个为你的项目生成统一测试的框架,它会提供一些函数去测试你的代码而且有漂亮的结果输出。

自从我开始考虑测试,阅读和与人交谈它,我发现另外一个很棒的工具,它会补充你在这些统一测试中的工做。它就是 Behat,一个 PHP 的 BDD 框架。

BDD(行为驱动开发)是来自 TDD(测试驱动开发)的开发过程。这些缩略词如今不重要,重要的是您可使用更天然的语言来指定您的测试,这是非技术人员能够理解的语言。

这个语言被称为 Gherkin,用于描述正在测试的预期行为,使用 Gherkin的测试描述,以下所示:

 

 
图5:看吧,这就是现代化 PHP 该有的样子

 

在这些行后面有 PHP 代码,只有在该方法的 PhpDoc 中指定的行和正则表达式之间存在匹配,就会调用该代码。该代码使用你的 SDK、应用程序或者 web 系统实现这些步骤以及真正的用户将执行的操做

Behat 的工做流程十分流畅。在一切正确配置以后,你就能够开始编写测试功能的全部可能方案。当你首次运行 Behat 时,它会提供你全部那些你应该添加到 PHP Context 类中的方法模板以便实现场景中的每个步骤。

在那以后,你就能够为每个步骤编写实际代码并重复此循环。

  • 为每个步骤编写 PHP 代码
  • 运行测试
  • 若是一切正常,为其它步骤编写 PHP 代码
  • 若是有地方出了问题,修复它

在配置和阅读文档半小时后,你能够准备使用 Behat,到最后你会发现全都是 PHP 代码而且已经发现你已经知道若是使用它编程。

持续集成

持续集成( CI ) 是一个过程,它提供一个为软件工程师建立软件的一个方法。

简单的说,它就是常常(可能一天几回)将小块代码整合进基础代码当中的行为。代码已经测试过且不会出现突发状况。CI 帮我咱们自动构建,测试和部署到咱们的应用中。

只要几回点击,就能够将你的 Github 的项目集成到 Travis CI 中以后你每次将代码推送到仓库,它会运行你建立的 PHPUnit 和 Behat 文件,并告诉你最近的功能是否已经准备,或没有,或将要被合并。除此以外,你可使用 Travis CI 将你的代码部署到生产环境中运行。

经过一个明肯定义的工做流程来完成工做流程是很是好的,Travis CI 能够帮助咱们完成这个工做。阅读这篇 Getting started ,了解软件开发过程是如此有趣而并不只仅是代码自己。

遵循 PSR-1 和 PSR-2

若是你还据说过 PSR ,那你应该立刻去了解。实际上,PSR 是 PHP Standard Recommendations 的简写,是由 PHP-FIG (PHP Framework Interop Group) 推出的。PHP-FIG 是由一些大的 PHP 项目、框架、CMS的成员组成的组织,旨在思考这门语言的将来、生态,讨论语言中应遵循的标准。

很长一段时间以来,PHP 没有编码风格之说。个人年纪还不是很大,可是每一次我看别人的项目或库的时候,它们都使用不一样的编码风格。有时候花括号在这个位置,有时候它又在下一行,一个长行的处理方式也会有好几种,各类不一样的编码风格和喜爱混合在一块儿,一团糟。

PHP-FIG 作了不少的工做,经过推出统一的编码规范,他们好像在说:“不要再纠结编码风格了,让咱们全部人都遵循一个标准,而后重心都集中于好软件的制做上吧”。如今,不管何时你想阅读某人的代码时,你只须要关心代码是如何运行的就能够了,而不用再指责他的代码风格和结构了。

截止至此篇文章发布,已经有9个达成共识的 PSR 标准推出,为通常问题提供了通用解决方案。若是你还不知道这些标准,就从 PSR-1 和 PSR-2 开始吧。

这些标准提出了现代 PHP 的编码风格,确保你已经读过并已经开始使用它们了。别想着你能在写代码的时候所有想着它们,这是一个漫长的过程,可是你应该知道,有一些工具能够辅助你使用和记住它们。

PHP CodeSniffer 就是一个你能在 Packagist 上找到并使用 Composer 安装的工具。我认为这个库的名字并非很理想,由于它实际上包含了两个工具, phpcs 和 phpcbf。

Phpcs 用于代码风格检测,它会全面扫描你的代码,找出那些不符合已经配置好的编码规范的部分。

你可使用 phpcs 内置的不少种编码规范,也能够自定义编码规范。在扫描的最后,它会为你列出不符合编码规范的代码片断,很是棒。

那么,怎么才能把错误改正呢?你能够打开每个文件,改代码,再运行 phpcs ,看看是否还有错误,而后重复这个过程。很是无聊。

为了解决这个问题,PHP CodeSniffer 提供了另外一个工具,叫作 phpcbf 或 PHP Code Beautifier。在同一套编码规范设置下,运行 phpcbf,它就会在不破坏你的代码的前提下,尽最大努力为你改正全部的错误。

试着创建在代码提交以前运行 phpcs 和 phpcbf 的习惯,这将会保证你全部的代码都符合编码规范,若是有人喜欢你的工具(或工程)而且想贡献代码,他们在阅读你的代码时将不会有任何阻碍。

框架

我不打算花费太多的时间来讨论框架,如今已经有一些不错的框架了,或流行或小众。我的而言,更倾向于不使用那些内置全部功能的重型框架,个人想法是,你仅仅选择你须要的那个就行了。

若是你须要一个 HTTP 客户端,你可使用 Guzzle。若是你须要使用模板引擎,那么你可使用 Twig。若是你须要一个路由,那么找一个可以知足你需求的组件并使用它就行了。将这些组件组装起来,打造你本身的应用吧。

Symfony 框架沿着这个方向已经作了很伟大的工做。你能够为你的项目使用整个框架,或者仅仅选择并使用你想要使用的一部分。就是那么的简单。

然而,不管什么时候我想使用框架来完成一个应用时,我总会从为被称为微框架的那些框架中选择一个。它们真的很轻,仅仅提供基本的功能,易于定制化,而且能够方便的让它来适应你的项目架构。

我选择的微框架是 Slimframework ,我以为你应该读一读它。对于处理小型项目,它真的很简单,可是对于较大的项目,使用它就有些复杂了。

顺便向正准备编程的同窗们说一下,我真心以为,在你选择一个框架并打算一直使用它以前,你应该动手创造一个属于你本身的框架。这会让你理解框架的运行机制,而且能更快地适应大型框架。

现代PHP工具包

让咱们用一系列工具包来结束文章。 对我来讲,这些组件、工具和库描绘了现代PHP的样子:

  • Slimframework: 一个很好、很酷的小型框架
  • Symfony:一个由不少优秀、可重用组件构成的重量级框架
  • Guzzle::能够很简单容易发起HTTP请求的客户端
  • PHPUnit: 一个测试框架
  • Behat: 行为驱动的测试框架
  • PHPCS/CBF:代码规范、美化工具
  • Faker:生成测试数据的库
  • Psysh: 充满使人惊讶的交互式控制台
  • Composer:依赖管理,且有着其余不少有用的特性
  • Packagist:PHP包仓库
  • Twig: 模板引擎

我知道,文章的标题真的有些狂妄。其实我想要说的是PHP正在进化,PHP生态圈也在以一样(也许更快)的速度进步。

相关文章
相关标签/搜索