京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3700|回复: 0

比 Java 更具争议的 PHP,处处留坑?

[复制链接]

10

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2019-5-20 02:52:52 | 显示全部楼层 |阅读模式 来自 中国
编程语言之争自古以来就从未停歇,对于有着“世界上最好的编程语言”之称的 PHP,表面看似赞扬,实则为讽刺。PHP 确实简单易上手,但是其函数命名不规范、核心异步网络不支持、后期维护困难等缺点,让不少开发者避之不及。不过,PHP 经过了这么多年的发展,还是槽点满满吗?
. X2 {7 I6 C( b5 E! K+ ]3 J1 D3 Y3 X
: m  [2 H! _# H  o% u出品 | CSDN(ID:CSDNnews)1 Z! Z+ X' _0 ?9 i% P
你还记得几年前流行的那篇名为“全面解析PHP的糟糕设计(PHP: a fractal of bad design)”(https://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/)博客文章吗?当我第一次读它的时候,我在一个不入流的公司工作,那里有很多老旧的PHP项目。这篇文章让我思考我是否应该放弃编程,去做一些完全不同的事情。# t3 E6 [; V; C9 @% P
幸运的是,我很快地就换了份工作。更重要的是,自5.*版本后,PHP有了长足的发展。今天,我想向那些不再使用PHP编程,或者仍然在老旧项目中蹒跚踯躅的人分享我的一些切身体会。" I! t* c. x: ~* {. Q8 g6 |
剧透一下:今天的PHP依然有些很糟糕的设计,就像几乎所有的编程语言都有它的怪癖一样。很多PHP核心函数的方法签名仍然不一致,它的配置设置仍然很混乱,许多开发人员仍在编写蹩脚的PHP代码,因为他们不得不这样做,或者因为他们不了解更好的写法。$ V& E  Q2 s5 V' V( P0 W9 V, q6 R
今天我想在这里分享的是PHP的阳光的一面,让我们把注意力放在那些已经发生了变化的地方,以及可以帮助大家编写干净且可维护的PHP代码的方法。接下来的几分钟内,我希望大家先抛开任何偏见来阅读。6 f6 E7 Y) m, x% R) L( T% o
读完会,你可以自由地和以前一样思考PHP。尽管有很大的机会,你会对过去几年PHP所取得的下列进步感到惊讶:
1 {, Z# N/ O) `- K( |2 H) {

    0 T( [1 ^& E; u3 h
  • 每年都会有一个新的PHP版本在活跃地开发。
    ( Y1 l. E/ ?) h% C" |
  • 新的PHP性能至少是PHP5时代的两倍,可能已经达到了三倍。
    ; q. I  b) d$ ]4 C5 T3 X( b' h
  • 有一个非常活跃的涵盖了框架、包和平台的生态系统。
    5 s. K! g1 L/ E+ U& K
  • 在过去的几年里,PHP增加了许多新特性,并且语言自身在不断发展。6 B) X, L1 P8 n* v
  • 静态分析工具在过去几年已经成熟,并且会不断增长。. u( A: P1 p$ Z+ L; ~' Y7 c
下面我会附上我的一个业余项目的源代码来解释说明,它是用PHP和Laravel编写。这里是我们在办公室维护的几百个OSS包的列表。这两个都是现代PHP项目的好例子。6 j4 `0 z0 q5 x; s2 [
让我们开始吧。
! y: _- a8 z5 i
& d2 s# U8 v% P9 K, h历史总结
; R# t. Y8 ~3 G4 T; _2 v: Z为了更好地衡量,让我们今天快速回顾一下PHP的发布周期。我们现在使用的是PHP 7.3版本,预计2019年底将发布7.4版本。而PHP 8.0版本将是7.4版本之后的下一个版本。6 N  r" \. v! c# h  h1 f
从5.* 时代后期开始,PHP核心开发团队就努力保持一年一个新版本的发布周期,并且在过去的四年中成功地做到了这一点。
5 x/ M) w# V. `- H% q1 Y总的来说,每一个新版本都会得到核心团队两年的积极支持,再加上一年的“仅提供安全补丁”的支持。目标是鼓励PHP开发人员尽可能地使用最新版本。因为每年进行小的升级要比从5.4版本直接升级到7.0版本容易得多。
: a1 M, P% ]7 N4 y, P- O5 s) W关于PHP版本发布/更新的日程安排的最新情况,可以在这里找到(https://www.php.net/supported-versions.php)。* f# J4 C" ?9 T% B
最后提一下,PHP 5.6是5.* 的最后一个版本,它的下一个版本就是7.0版。如果你想知道PHP 6发生了什么,可以收听PHP Roundtable上的这个播客音频(https://www.phproundtable.com/episode/what-happened-to-php-6)。: f7 M6 C9 {" X, m3 M1 i8 _4 w
从那里,我们可以认清关于现代PHP的一些常见误解。- s( o' b4 @6 m# C& f

5 B" n$ u, R* Y& N! I+ JPHP的性能$ [5 ^% F$ T4 c* K6 U: B
回到PHP 5.*时代,那时候PHP的性能在最好的情况下也只是中等。然而,到了7.0版本后,PHP核心的大部分被从头开始重写,这将它的性能提高了两到三倍。# i8 s" K* N. z7 z4 O+ G# F# G
光用言语不能证明这一点。让我们看看基准测试的结果。幸运的是,有人在PHP性能的基准测试上投入了大量时间。我发现Kinsta(https://kinsta.com/blog/php-benchmarks/)的这篇文章提供了一个最新的不同版本的性能比较列表。
: z# l% U$ A, D% n( l; e9 Y自从7.0升级以来,性能提高了如些之多。以至于PHPWeb应用程序的性能已经可以和其他语言的Web框架相当(在某些情况下甚至更好)。看看这个扩展的基准测试套件(https://github.com/the-benchmarker/web-frameworks),可以得到更多信息。
8 v+ W/ T( W7 {1 D' u, H) R- }当然,PHP框架在性能上不会优于C和Rust,但是它们确实比Rails或Django要好得多,并且与ExpressJS相当。" R, Q  {. m- O7 Y  y

* v7 M  [$ z) T  u9 ]框架和生态系统" i% X  `$ A! }/ m$ S: C
说到框架:PHP不再只是WordPress了。作为一个专业的PHP开发人员,让我告诉你一件事:WordPress在任何方面都不再能代表当代的PHP生态系统。
+ k0 S- x$ A$ Q2 T4 N7 T6 w总的来说,PHP有两个主要的Web应用程序框架:Symfony和Laravel。当然还有几个较小的框架,如Zend, Yii, Cake,Code Igniter等等。但是如果你想了解现代PHP开发是什么样子,你最好擅长使用这两个主要框架中的一个。
, Z. H2 a7 U3 B/ S6 `' H+ u这两个框架都有一个由软件包和产品组成的大型生态系统。从管理面板,CRM,到独立软件包,从CodeIgniter(简称CI)到profiler,从Web套接字服务器、队列管理器、至支付集成等众多服务。老实说,这里有太多要列出的内容。
6 j8 ~  x. Q' k6 B& _不过,这些框架都是为实际开发需要而设计的。如果你需要纯粹的内容管理,像WordPress和CraftCMS这样的平台只会越来越完善。
: }( j2 Y; w) J2 d2 V9 T; H6 U衡量PHP生态系统当前状态的一种方法是查看Packagist,它是PHP主要软件包的代码仓库。它现在以指数级别快速增长。每天下载量为2500万次,可以公平地说,PHP生态系统已经不像以前那样地处于劣势。
6 O" n# q+ A* W8 M/ l! S5 j下面这张图展示了随着时间的推移,包和版本的数量增长情况。这张图可以在Packagist官网上找到。
! H# d3 w4 q  a1 Z( }
: B8 z3 T; V. d4 G$ r) B除了应用程序框架和CMS之外,我们还看到了异步框架在过去几年的兴起。
5 t0 ^" _! T  {, j1 v2 o" O( G: c这些用PHP或其他语言编写的框架和服务器,允许用户运行真正的异步PHP。异步框架的例子包括Swoole、Amp和ReactPHP。
" [( c, J( O4 N5 }我们已经步入了一个异步编程的世界,像Web套接字和具有大量IO的应用程序之类的东西实际上已经越来越被PHP世界所关注。" K  ^4 `# Q, O( _% d6 I8 _9 v
PHP内部邮件列表-这个核心开发人员讨论语言开发的地方,也在讨论把libuv添加到内核中来支持异步编程。对于那些不了解libuv的人来说,可以认为libuv是Node.js用于允许所有异步性的一个库。+ C1 P% h' l7 x# [5 K0 v' E/ J
& V2 N: ]" t! P
PHP语言本身
# Y5 F  ^& V3 Y9 m: y* |虽然async和await这两个特性现在还不可用,但是在过去的几年里,PHP语言本身已经有了很多改进。下面是一个非详尽的PHP新特性列表:
) E; E  Y6 v% G2 s2 D2 W7 S
    8 C# w8 O0 s- g  E* M3 `( \, g
  • 短闭包(Short closures):https://stitcher.io/blog/short-closures-in-php
    # N0 Q" Z' {' s
  • Null合并运算符:https://stitcher.io/blog/shorthand-comparisons-in-php#null-coalescing-operator' U1 b1 U) B! j5 x8 G
  • Traits(注:一种为PHP这样的单继承语言而设计准备的代码复用机制):https://www.php.net/manual/en/language.oop5.traits.php4 [5 Z5 ~9 p1 d9 q6 Z6 F; o
  • 属性类型化(Typed properties):https://stitcher.io/blog/new-in-php-74#typed-properties-rfc
    ; D# S5 l' d" W' B
  • 扩展运算符(Spread operator):https://wiki.php.net/rfc/argument_unpacking
    & A( s  ~7 s% M" l( ^% h
  • 即时编译器(JIT compiler):https://wiki.php.net/rfc/jit
    7 u$ E6 T) e- E: z& T' @
  • 外部函数接口(FFI):https://wiki.php.net/rfc/ffi! d- W1 ]- M- c5 g% z. K# _* [$ @
  • 匿名类:https://www.php.net/manual/en/language.oop5.anonymous.php7 R1 U" Y) ~. |8 l# A2 ~
  • 声明返回类型:https://www.php.net/manual/en/functions.returning-values.php#functions.returning-values.type-declaration
    . k0 u) c2 W" q8 Q) h4 E! r0 p
  • 现代加密库:https://wiki.php.net/rfc/libsodium
    % S0 Y3 j) V. v& [
  • 生成器:https://wiki.php.net/rfc/generators
    % l/ f% g9 F) ^# ?  a
  • 很多其它特性:https://www.php.net/ChangeLog-7.php
    8 v" P2 L* V3 ?, K( `
当我们讨论编程语言特性的主题时,让我们也来谈谈当今编程语言的发展过程。首先有一个活跃的核心志愿者团队,他们推动了编程语言的发展。同时开发社区成员可以提出RFC。: \2 Z/ i  S$ h5 S3 `" r8 O
接下来,这些RFC 会在“内部”邮件列表中讨论,邮件列表可以在线阅读。在新的语言特性被添加之前,必须进行投票。只有得到三分之二核心团队同意的RFC才允许被添加进来。
+ @- a+ N9 W4 ^( t允许投票的可能有约100人,但是并不要求每个人都对每个RFC投票。核心团队的成员当然可以投票,因为他们必须维护代码库。除了他们之外,还有从PHP社区中单独挑选出来的人可以投票。这些人包括PHP文档的维护者、整个PHP项目的贡献者以及PHP社区中的杰出开发人员。4 I' W5 q9 Y' y. q+ y: W
虽然大多数核心开发都是在自愿的基础上完成的,但最近JetBrains雇佣了一名核心PHP开发人员Nikita Popov来做全职开发工作。另一个例子是Linux基金会最近决定投资Zend Framework开源框架。这样的雇佣和收购确保了PHP未来发展的稳定性。
# X9 O) v- w6 b% `
. I- Y* `" q2 U: F; I工具
) A$ L  ?1 t4 M& j除了PHP核心本身,在过去的几年里,我们看到了围绕PHP开发的工具的增加。首先我们想到的是静态代码分析工具,像Vimeo团队开发的Psalm,以及Phan和PHPStan。2 S5 }# V. n8 A3 d$ N# d' ~' e& d4 }; M$ |
这些工具将静态分析你的PHP代码并报告任何类型错误,以及可能导致的bug等等。在某种程度上,它们提供的功能可以与TypeScript相媲美。但是PHP现在不提供转换(transpile),所以不允许使用自定义语法。' g0 r$ [; J) v. T" H
尽管这意味着我们需要依赖docblocks,但是PHP之父Rasmus Lerdorf确实提到了在核心中添加静态分析引擎的想法。虽然潜力巨大,但这也是一项艰巨的任务。* F+ A# m* w( B1 G) _
说到转换(transpiling)。受到 JavaScript 社区的启发,目前 已经已经有人开始在用户领域扩展PHP语法。一个名为Pre的项目就是这样做的,它允许新的PHP语法转换为普通的 PHP 代码。( f) E9 ~9 E9 q8 e6 L" }( R
虽然这个想法已经在 JavaScript 中被证明可行,但是只有先提供了适当的IDE和静态分析支持,它才能在PHP中工作。这是一个非常有趣的想法,但它必须经历一个成长过程才能称为“主流”。
+ V6 U  j( Z" X' Z* [7 A) h# l  C0 s- j4 F
结语* a$ ^& w- Y3 h: b2 }) p
虽然说了这么多,但是你仍然可以把PHP看作是一种蹩脚的语言。这门语言确实有其缺点和20年的传承包袱,但是我可以自信地说,我喜欢用它工作。4 W  a. |5 S9 B6 T4 l
根据我的经验,我能够用它来创建可靠的,可维护的和高质量的软件。我为之工作的客户和我一样,他们对最终的结果很满意。0 X* v3 a0 E. a. J7 k$ J' Z
虽然用PHP仍然可能做出很多混乱的事情,但如果使用得当和正确的话,我会说这是Web开发的一个很好的选择。6 r8 i+ D2 F2 Q$ ]1 P5 x5 w1 K
原文: https://stitcher.io/blog/php-in-2019  a5 i5 s0 z/ F% j0 z+ j
本文为 CSDN 翻译,转载请注明来源出处。
- ?; P# o& g* ~; T4 S0 x! x0 K5 @7 v+ p# Z: A; R

6 ~# s4 V* i$ l  u1 {* ?. g来源:http://www.yidianzixun.com/article/0M23zYdl8 q* ?2 A+ u: A- E3 r- l
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

帖子地址: 

梦想之都-俊月星空 优酷自频道欢迎您 http://i.youku.com/zhaojun917
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2026-9-16 12:29 , Processed in 0.043295 second(s), 25 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表