首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

现代PHP是个什么样?

作者:FarazUsmani,来源:Wikipedia

本文标题写的有点大,你觉得呢,我觉得是有点大。 虽然我用PHP已经若干年,我怎么能说这门语言的最佳实践与工具呢?我不能说,但我会继续用。

我看到开发者使用PHP开展工作的方式发生了本质的变化 ,不仅在语言上发生了巨变,新版本与新功能改进越来越成熟强大,而且整个生态系统也正在发生变化。

PHP社区正在创建新的工具,库、框架与文档,其定义的新模式使代码更加优雅,容易理解。很多人们都在想办法让工作更有效、干净和更有趣。

我得承认,我不是喜欢应用新趋势的人。实际上,当我采用新的工具时,且认为它会改善我的工作,然后确定有社区在背后支撑。接下我就会尝试按最佳实践编写我的代码。

正是因为如此,我花了一些时间开始使用Composer和PHPUnit。大概在一年前,或多或少地,循序渐进地,我开始为那些闪光的新事物敞开了心扉。

我开始喜欢新的工具产生,我暂时放下VIM,尝试使用新的IDE,我发现与XDebug集成的PHPStorm的工作流和体验很好。

一些库和好用的工具,PSR排在第一,然后是Composer,PHPUnit,Travis-ci乖让我惊叹不已。

什么是现代语言?

作者:KarenRoe,From Flickr

网上有很多PHP相关的文章,但很多写的都非常糟糕。如果你不得不使用PHP开发,用网上粘贴的代码,丑陋的语法和老旧的代码,是无法做出想要的产品,也会让我们的生活变得也糟糕。

如果您仍然在遗留的代码上做开发,也许你的生活并不一定很美好。如果你在一个新项目上工作,并能够应用到所有的新工具,您将看到一个崭新的PHP。

PHP社区每天会反馈一些BUG,大多数是细节与我们的项目关系并不太大。但是我们不能不关注语言、社区和生态系统发生的变化,而且PHP社区也越来越成熟。在中国,你可以多关注鸟哥的博客。

我正在现在的公司开发一个内部API的SDK,就像做一个宠物项目一样,严格遵循技术最佳实践。虽然以前的日子里我也一直坚持在做,但是在某些事情我也需要做一些改变和调整。而这些变化就是我这段时间学到的内容,也就是本篇文章的主题,我称之为现代化的PHP。

从工作流程开始

TRIO FABRIKKER - 来源:https://nos.twnsnd.co

前面和大家说过,我是个IDE新手,但一见钟情。 PHPStorm是一款伟大的软件,它是我第一次用也是唯一用的IDE,我甚至不用再尝试其它的IDE软件。PHPStorm与XDebug的集成非常完美,支持PHP命名空间解析,artisan集成,Git集成,自动完成,代码生成与重构等特性。

当然,您不一定要使用IDE,这完全由个人喜好决定,可以使用任何称手的工具适合自己。比如还可以选择如VIM,Atom,Emacs,Bracket,Netbeans,Eclipse,UltraEdit,NotePad++等编辑 器。这里我想要说的,选编辑器的两个重点是生产力和人体工程学,IDE或文本编辑器要在这两处能帮助我们。

不过,对我来说,最重要的是调试工具集成。编写大小项目代码,都要拥有一个完善的调试器,它能让我们忘记var_dump和print_r。我们可以在运行时跟踪这些变量,分析堆栈状态,设置代码断点。这些让我们开发和重构更容易。

我不知道还有没有其它选择,XDebug能够让我们拥有这一切。你安装它了吗?如果还没开始做,请花一点时间来设置XDebug并把它集成到IDE或编辑器,使用正确的工作来调试代码。

另外需要提起您注意的工具是GitHub。我们的社区也有很多Git和GitHub相关的不少文章,还有帮助我们如何把代码放置在版本控制系统下。但是,我想告诉您还有另外一个缘由。

这个就是整合。我们还有一些工具应该与GitHub整合。这些工具可以生成各种数据指标,在运行测试、持续集成过程中为我们提供帮助。

依赖管理

图为InstituoPasteur,拍摄于葡萄牙里斯本。

现代的PHP生态系统另一点是依赖管理,Composer是负责这个工作的好工具。

Composer已经有5岁了,在我看来,这几年才开始大规模采用。也许是我不是最早的使用者,也可能PHP开发者不愿意改变。

这个工具为代码包提供了一个前端,它由一个PHP库、项目和工具组成的PHP包项目库,源代码存储在Github或BitBucket等其它地方。

在这篇文章中我们讨论的所有库,也可能是您喜爱的项目,可以通过简单的方式添加到项目中。

# composer requirepackage_vendor/package_name

如果不知道软件包的作者,可以使用 search 来查找软件包并正确安装它。

# composer search package_name

用Composer完成这些工作,管理软件包依赖,它是一个非常好的工具。Composer还有很多有用的功能,值得我们花时间在安装完之好好阅读它的文档。

正确的命令行界面

我真的很喜欢使用CLI界面来快速尝试创意。对我来说,最大的REPL工具就是IPython,它能帮我自动完成代码,让我轻松定义函数,快捷访问文档和其它一些令人惊喜的功能。对PHP开发者来说,这个工具是Python的工作,而不是给PHP的。

在PHP的世界里,我们有一个叫“交互模式”的东西,可以在终端访问,只需要输入:

# php –a

Interactive shell

这时候,我们就处在CLI交互模式中了,可以进行测试,但是PHP提供的这个工具有点不直观。我试了几次略觉不爽。我知道IPython能做挺多事,于是我暂时放弃使用它。

幸运的是,在PHP世界里,有一个很酷的新CLI界面,名字叫Psysh。Psysh是一个神奇的工具,有着和IPython一样有趣的功能,可以用Composer安装为全局或单个项目使用。

对我来讲,最好的Psysh功能是内置文档,想查一个PHP函数,不必去php.net,但是也需要做一些事情才能完全发挥作用。

安装完成后,输入以下命令即可工作。

apt-get install php7.1-sqlite3

mkdir /usr/local/share/psysh

wgethttp://psysh.org/manual/en/php_manual.sqlite-o /usr/local/share/psysh/php_manual.sqlite

如果您已经安装了Sqlite,第一行命令不是必须的,可以跳过。第二个命令用来创建psysh的工作目录,用来存储文档。这些都需要用root身份执行。

现在,您可以这么做:

以上界面为psysh的文档界面,显示的是关于json_encode函数的使用方法

您应该开始测试

这是我每天都要对自己说的口头禅。像很多人一样,我不像TDD所说的那样复杂的测试。

我下一步要处理一个复杂的遗留项目,中间也进行一些测试,发现代码是如此脆弱和僵化,我想添加一些功能代码,会把原有的代码功能破坏。

推荐使用PHPUnit,正如官方网站所说的:

PHPUnit是面向程序员的面向PHP的测试框架。

它是单元测试框架的xUnit体系结构的一个实例。

PHPUnit是一个帮助你的项目在创建测试的框架,做整体的测试。它提供了一系列函数来测试代码的执行结果,并输入测试结果。

自从我开始考虑测试,阅读和与人沟通。我发现了另一个很棒的工具,它叫Behat,补充了我在统一测试中的其它工作,这是PHP领域中的BDD框架。

BDD(Behavior-Driven Development)是一个来自TDD(测试驱动开发)的开发过程。这些缩略词现在并不重要,重要的是可以使用更自然的语言来开始测试,这些并不是技术人员可以理解的语言。

这种语言被称为“Gherkin(小黄瓜)”,用来描述正测试的行为预期。使用小黄瓜的测试描述语言如下所示:

在这些行的后面有PHP代码,只要在PHPDoc中指定的行与正则表达式存在匹配,就会调用它。这段代码实现了这些步骤,以前当真正的用户调用你的SDK时会是什么现象。

Behat的工作流程非常流畅。当配置完成后,可以写所有可能的场景来测试一个功能。第一次运行Behat时,它会为您提供所有应添加到PHP上下文类中的方法模板,以实现场景中的每个步骤。

之后,开始写每步的实际代码,并不断重复这个循环。

1 实现PHP代码的第一步

2 运行测试

3 如果运行顺利,再不衫不履 一段PHP代码

4 如果有问题,修复

经过半小时的配置和阅读文档,你准备使用Behat,你会发现它包含了全部的PHP代码。

持续集成

持续集成(CI)是一个过程,这也是一种做事情的方式。对开发者来说,这个事情就是创建软件。

用简单的英语来说,就是将小块代码不断地合并到代码库中。代码已经过测试,并不会破坏任何东西。CI帮助我们的应用程序自动化的构建、测试和部署。

只需点击几下,就可以把GitHub项目与Travis CI集成在一起,并且每次推送到存储库,然后运行PHPUnit和Behat创建的测试,告诉我们已经实现最后一个功能,是否已准备好,是否合并。除此之外,可以使用Travis CI来把代码部署到生产机和测试机。

Travis CI可以帮我们完成一个工作流程,良好的开发过程。遵循这个良好的习惯,你会发现软件开发的过程多么有趣,而不仅仅是代码本身。

PSR-1与PSR-2

如果你不知道PSR是什么,你该去做个功课。实际上,PSR代表着PHP标准建议,由PHP-FIG(PHP Framework Interop Group)提出,PHP-FIG是由最大的PHP项目,框架和CMS组成的联盟,由他们来考虑语言、生态系统和未来要遵循的标准。

很长一段时间,PHP没有编码规范。我不是那么守旧,每次都看到某个人的项目或库用了不同风格的库。有时候括号和条件放在一起,有的被放在下一行,有的函数采用下划线,有的用了驼峰风格。如此等等的风络,几乎成了一个烂摊子。

PHP-FIG做了很多工作,也提出一个统一的代码风格。他们这样和开发者说:“不有再担心代码风格,让每个开发者都遵循同一个标准,一起创建优秀的软件”。这样,当我们看到每个人的代码,只需思考功能的完成和完善,而不用再指责格式和结构。

在本文正在写作之时,已经有9个PSR已接受的问题并提供了共同的解决方案。但是,如果你对这些标准一无所知,我们从PSR-1和PSR-2开始。

这些标准共同组成了现代的PHP编码风格。请确保在开始使用它们之前仔细阅读。不要以为在编码时你会记得所有这些,这需要一段过程,但是可以确定的是,有一些工具可以帮助到我们。

PHP CodeSniffer是个可以在Packageist上找得到的工具,可以用Composer来安装。我不认为代码仓库的名是最好的选择,是因为它包括两个不同的工具,分别是phpcs和phpcbf。

Phpcs是个代码嗅探器,它会扫描整个代码,寻找不符合编码标准的部分。我们可以使用phpcs几个编码标准,还可以创建自己的风格。当代码扫描结果后,phpcs会向我们展示一些不符合标准的代码段列表。

比如我们想让代码的错误信息。需要打开每个文件,修改代码,然后需要再次运行phpcs,查看错误是否显示,然后重该过程。这会比较无聊。

为了解决问题,PHP CodeSniffer提供了另外一个叫phpcbf的工具,这个工具另一名字叫PHP Code Beautifier。运行phpcbf,遵循相同的规则,并且为你修改相关的内容,能够在不破坏代码的情况做到最好。

框架

我不会发太多时间来讨论框架。有好的也有不好的,每个框架都有优点缺点。就个而言,我宁愿不用那些大框架。适合自己的需求够用就好。

比如你需要一个HTTP客户端,可以用Guzzle。如果需要模板引擎,就用Twig。如果需要一个路由,找到一个适合自己的需求,并且用好它。把这些组件粘合在一起就能创建好一个好的应用程序。

Symfony在这个概念做得很好。我们可以将整个框架用于一个项目,也可像引用库一样,随心所欲的调用它,就是这么容易。

然而,当我需要一个框架来编写应用程序时,我首先选择所谓的“微框架”。它们非常小巧,只提供基本的架构,易于定制,更容易让它们随着您的项目结构。

我选择的微框架是SlimFramework,我建议您可以阅读它的源代码,用它来做小型项目很简单,对于大型项目会复杂一些。

顺便说一句,对于那些刚刚刚开始编程的朋友来说,我认为,在用框架之前,您应该用自己的库来完成项目,尝试创建自己的框架。这会让你对整个PHP机制有所了解,且可以大大减少代码的开发。

现代PHP工具箱

下面我们用链接来完成本篇文章。对我自己来说,组件、工具和库代表了很多现代PHP的功能:

Slimframework 一个非常不错和微框架

Symfony – 一个大型框架,有不少强大的可重用组件,类似的框架如Laravel是在它的基础上发展起来的。

Guzzle – 一个简单易的HTTP客户端

PHPUnit – 一个用于整体测试的开发框架。Facebook也在用。

Behat – 事件驱动的开发框架

PHPCS/CBF – 代码嗅探器和代码美化器

Faker – 数据生成器

Psysh – 一个开发者命令控制台(CLI),有着强大的功能

Composer – 依赖管理和其它有用的功能

Packagist – 包存储库

Twig – 模板引擎

本文的标题起的有点大,或许还有点自以为是:) 但我真正想给大家展示的是,PHP正在发展,生态系统也在以同样的速度(也许更快)地发展。

作者:Felipe Lope

标题:This is what modern PHP looks like

编译:21CTO社区 – Raymond

原文:https://medium.freecodecamp.org/this-is-what-modern-php-looks-like-769192a1320

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180122B0KS4200?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券