开发者回忆:PHP早已不是十年前的模样

 发布了一篇文章,详细介绍了 2019 年的 PHP 是怎么样的。Brent 承认 PHP 当前仍然存在一些问题,比如许多核心函数仍然有不一致的方法签名、配置设置还是令人困惑,但是以他自己的开发经验来看,他认为 PHP 是 Web 开发的绝佳选择,使用 PHP,他可以创建可靠、可维护和高质量的应用,并且自己与客户对最终结果都满意。

文章中 Brent 关注于 PHP 这些年来发展得好的一面,他通过几下几点,说明“ 不再是十年前那一门糟糕的语言了”:

  • PHP 正在积极开发,每年都会发布新版本

  • PHP 5 之后性能在不断提高

  • 有非常活跃的框架、包和平台组成的语言生态

  • PHP 在不断发展,过去几年中添加了许多新功能

  • 各种开发工具在过去几年中已经成熟,并且保持增长

PHP 正在积极开发,每年都会发布新版本

当前 PHP 版本是去年 12 月份发布的 7.3,7.4 预计在今年年底发布,而 PHP 8.0 将是 7.4 之后的下一个版本。

自从 5.X 时代以来,核心团队希望每年发布一个新版本,在过去四年中他们成功维护了这么一个发布周期。通常每个新版本都会得到官方两年时间的积极支持,之后有一年仅提供安全修复,其目的是激励 PHP 开发人员尽可能保持更新。

更加具体的发布与维护周期可以查看 PHP 官网的介绍:

看到上边这个表,你可能会发现版本号从 5 跳到了 7,那 PHP 6 去哪里了?

其实早在 2005 年,PHP 社区就发起了 PHP 6,但由于实现 Unicode 面临的困难太大,项目最终流产,PHP 官方没有发布 PHP 6 GA,并且在 2010 年将 PHP 6 取消。虽然 PHP 6 项目取消了,但其大量已实现功能集成到了 PHP 5.X 中,包括 OOP 方面的改进,使得 PHP 从面向过程跨越到面向对象。

PHP 6 被取消了,但是之前对这个主要版本的研发都是以 PHP 6 的名义进行的,所以许多参考资料与书籍都是用“PHP 6”来指代该版本。官方担心这在放弃 PHP 6 之后会引起混乱,于是干脆不使用 PHP 6.X 版本号,直接从 5 跳到 7。

详情可以查看官方说明:https://wiki.php.net/rfc/php6

PHP 5 之后性能在不断提高

PHP 7.0 中,PHP 核心部分完全重写,带来了最新的 Zend 引擎,使得 PHP 性能提升了两到三倍。

作者引用了 https://kinsta.com/blog/php-benchmarks 的基准测试来说明这一点,指出自 7.0 以来,PHP 性能一直在提升,PHP Web 应用与其它语言的 Web 框架相比在一些情况下性能好很多。但他也表示:“当然 PHP 框架不会胜过 C 与 Rust,但比 Rails 或 Django 好得多,与 ExpressJS 相当。”

有非常活跃的框架、包和平台组成的语言生态

提到 PHP 的框架,不得不说 WordPress,但是作者表示 WordPress 绝对不代表当前的 PHP 生态:“PHP 框架再也不仅仅只有 WordPress 了”。

当前 PHP 中有两个主要的 Web 应用开发框架:Symfony 与 Laravel,还有 Zend、Yii、Cake 与 Code Igniter 这些,此外还有不少较小的框架。

Symfony 与 Laravel 都拥有庞大的包和软件生态,包括 admin 面板和 CRM、独立软件包、CI、分析器、Web socket 、队列管理器与支付集成等。

此外,近几年 PHP 异步框架也兴起了,Swoole、Amp 与 ReactPHP 是其中的佼佼者,它们是用 PHP 或其它语言编写的框架和服务器,用来运行真正的异步 PHP。

作者认为衡量 PHP 生态当前状况的一种方法是查看 agist 这个 PHP 主要软件包存储库的数据。通过以下趋势图,可以发现软件包数量呈指数增长,并且当前录入软件包有 223 217 个,总的安装量达到了 14 827 204 847,PHP 生态已不再像以前那么弱小。

各种版本的可用软件包的数量

每月包被安装数

PHP 在不断发展,过去几年中添加了许多新特性

尽管 async 与 await 这两个呼声极高的特性还没有实现,但是 PHP 这几年新特性不断出现,语言本身得到了各方面的改进。

下边列出了一些关注度比较高的 PHP 新特性:

短闭包,也称为箭头函数,这是一种在 PHP 中编写较短函数的方法。将闭包传递给 array_map 或 array_filter 等函数时,它可以发挥极大的作用。

// A collection of Post objects $posts = [/* … */];$ids = array_map(fn($post) => $post->id, $posts);

空合并运算符,它类似于三元运算符,但左边的操作数行为类似于 isset,而不是仅使用其布尔值。这使得此运算符对数组特别有用。它同时可在未设置变量时分配默认值。

$undefined ?? 'fallback'; //'fallback'$unassigned;$unassigned ?? 'fallback'; //'fallback'$assigned = 'foo';$assigned ?? 'fallback'; //'foo''' ?? 'fallback'; //'''foo' ?? 'fallback'; //'foo''0' ?? 'fallback'; //'0'0 ?? 'fallback'; //0false ?? 'fallback'; //false

Trait 是一种重用代码的机制,它可以减少单继承的某些限制。Traits 与类组合的语义定义了降低复杂性的方式,并避免了与多重继承和 Mixins 相关的典型问题。

Trait 类似于类,但仅用于以细粒度和一致的方式对函数进行分组,它是对传统继承的补充,可以实现行为的横向组合,类成员应用不需要继承。

<?phptrait ezcReflectionReturnInfo {    functiongetReturnType(){ /*1*/ }    functiongetReturnDescription(){ /*2*/ }}classezcReflectionMethodextendsReflectionMethod{    useezcReflectionReturnInfo;    /* ... */}classezcReflectionFunctionextendsReflectionFunction{    useezcReflectionReturnInfo;    /* ... */}?>

属性类型化,类变量可以定义类型,比如:

classA{    public string $name;        public Foo $foo;}

扩展运算符,这是一种新语法,可以直接在调用中解压缩参数,比如:

call_user_func_array([$db, 'query'], array_merge(array($query), $params));

直接用新语法可扩展出数组 $params:

$db->query($query, ...$params);

JIT 是一种编译器策略,它将代码表述为一种中间状态,在运行时将其转换为依赖于体系结构的机器码,并即时执行。在 PHP 中,这意味着 JIT 将为 Zend VM 生成的指令视为中间表述,并以依赖于体系结构的机器码执行,也就是说托管代码的不再是 Zend VM,而是更为底层的 CPU。

Foreign Function Interface,外部函数接口,它允许从纯脚本语言调用 C 函数、使用 C 数据类型,从而更有效地开发“系统代码”。对于 PHP,FFI 开辟了一种使用纯 PHP 编写 PHP 扩展和绑定到 C 库的方法。

匿名类,用于创建简单的一次性对象:

<?php// Pre PHP 7 codeclassLogger{    publicfunctionlog($msg){        echo $msg;    }}$util->setLogger(new Logger());// PHP 7+ code$util->setLogger(newclass{    publicfunctionlog($msg){        echo $msg;    }});

声明返回类型:

<?phpfunctionsum($a, $b): float{    return $a + $b;}// Note that a float will be returned.var_dump(sum(1, 2));?>

严格模式:

<?phpdeclare(strict_types=1);functionsum($a, $b): int{    return $a + $b;}var_dump(sum(1, 2));var_dump(sum(1, 2.5));?>

使 Libsodium 成为核心扩展,Libsodium 是一个现代加密库,由安全专家精心选择的加密算法组成,以避免侧信道漏洞。

生成器,提供了一种简单、无样板实现迭代器的方法。

各种开发工具在过去几年中已经成熟,并且保持增长

最后一部分,作者分析了当前 PHP 开发工具也在不断成熟,并且保持增长。

他以静态分析器为例,比如 添加静态分析引擎的想法。

受到 JavaScript 社区的启发,目前 PHP 也有在进行转换的相关研发,比如项目 Pre,它允许新的 PHP 语法转换为普通的 PHP 代码。虽然这个想法已经在 JavaScript 中被证明可行,但作者认为在 PHP 中,只有先提供了适当的 IDE 和静态分析支持,它才有可能实现。

讲完了 PHP 当前的这些变化,作者最后没有以“PHP 是世界上最好的语言”作结语,相反,他是这样说的:

All that being said, feel free to still think of PHP as a crappy language... I can say in confidence that I enjoy working with it.

话虽如此,但是还要继续认为 PHP 是蹩脚的语言那也是可以的。我可以很自信地说我喜欢 PHP。

原文地址:https://stitcher.io/blog/php-in-2019



您可能还会对下面的文章感兴趣: