2020 年的 PHP 回顾与展望
对于一般的 Web 开发人员和程序员来说,PHP 的声誉并不是很好,这已经是众所周知。
尽管 PHP 仍然是构建 Web 应用程序最常用的语言之一,但多年来 PHP 已经设法给自己赢得了代码库混乱、开发人员缺乏经验、代码不安全、核心库不一致等等的名声。
虽然许多反对 PHP 的论点今天仍然有效,但也有好的一面:您可以用 PHP 编写干净、可维护、快速和可靠的应用程序。
在这篇文章中,我想让你看到 PHP 开发技术有利的一面。
我想向您展示的是,尽管 PHP 有很多缺点,但它仍然是一门值得学习的语言。
我想让您知道,PHP5 时代即将结束。
如果你愿意的话,你可以写出现代的、干净的 PHP 代码,并且把 10 年前的很多烂摊子抛在脑后。
那么让我们来看看在过去的几年里,这种语言是如何变化的,甚至是如何成熟的。
我想请您把任何偏见放在一边,只花几分钟的时间,现代的 PHP 技术可能会让你感到惊讶甚至沉迷。
历史包袱#
在深入讨论细节之前,让我们回顾一下 PHP 这门语言目前是如何一步一步发展的。
现在的 PHP 版本是 7.4,PHP8.0 将是下一个版本,也就是 2020 年底。
自从 5.* 时代末以来,核心团队试图保持一致的年度发布周期,并且在过去的四年中已经成功做到了这一点。
一般来说,每个新版本都会得到为期两年的积极支持,并且会再获得一年的 “仅限安全修复”。
其目标是激励开发人员尽可能保持最新状态:例如,每年的小升级比在 5.4 到 7.0 之间的跳跃要容易得多。
最后,PHP5.6 是最新的 5.* 版本,下一个版本是 7.0。
如果你想知道 PHP6 发生了什么,你可以点击查看这篇文章。
PHP 现在的底层开发是由一群社区志愿者完成的,他们中的一些人是由雇主付钱让他们全职从事核心工作的。
大多数关于这种语言是如何发展的讨论都是在邮件列表上进行的。
现在这些历史问题你都有所了解了,让我们揭秘一些关于现代 PHP 的常见误解。
PHP 的类型系统#
PHP 一开始是一种非常弱的、动态类型的语言,这在当时有它的好处。
但是,自从人们开始在较大的项目中使用 PHP 以来,它的类型系统的缺点就变得明显起来,并且出现了对更强的类型支持的需求。
今天,PHP 是一种相当独特的语言:它仍然允许您编写完全动态的弱类型代码,但也有一个更强大的、可选择的类型系统。
结合静态分析工具,如 Psalm、Phan 和 PHPStan,您可以编写安全、强类型和静态分析的代码。
例如,看看这段 PHP 代码,它完全使用了它的现代类型系统:
<?php
declare(strict_types=1);
final class Foo
{
public int $intProperty = 2;
public ?string $nullableString = null;
private Bar $bar;
public function __construct(Bar $bar) {
$this->bar = $bar;
}
public function withInt(int $value): self
{
$clone = clone $this;
$clone->intProperty = $value;
return $clone;
}
public function unionTypes(int|float $input): void
{
// Union types will be added in PHP 8
}
}
说实话,PHP 的类型系统中仍然缺少一个重要特性:泛型。
他们有希望被加入,但目前还没有什么具体的东西。
如果是类型化数组,您将需要依赖文档块来获得适当的 IDE 支持:
/** @var int[] */
public array $arrayOfInts = [];
虽然类型化数组是泛型的常见用例,可以使用 Docblock 解决,但我们错过了更多功能,因为它们不是… 语言。
现在还不行。
PHP 的语法#
在语法方面,7.* 时代在使 PHP 成为更成熟的语言方面做了很多好事。
为了说明这一点,我在 PHP 中列出了一个非详尽的新功能列表。
数组解构:#
[$a, $b] = $array;
空合并运算符:#
$value = $object->property ?? 'fallback if null';
$value = $array['foo'] ?? "fallback if key doesn't exists";
空合并赋值运算符:#
public function get(string $input): string
{
return $this->cache[$input] ??= $this->sanitize($input);
}
数组扩展:#
$a = [/* … */];
$b = [/* … */];
$mergedArray = [...$a, ...$b];
可变的函数:#
public function get(Foo ...$foos): void
{
foreach($foos as $foo) {
// …
}
}
参数解包:#
$this->get(...$arrayOfFoo);
类型化属性:#
public int $intProperty;
箭头函数,也称为短闭包:#
$ids = array_map(fn(Post $post): int => $post->id, $posts);
生成器:#
function make(array $input): Generator
{
foreach ($input as $item) {
yield $this->doSomethingWith($item);
}
}
还有更多。
我希望从这份列表中可以清楚地看到,PHP 今天仍在不断发展,您可以肯定还会有更多的好东西问世。
PHP 的性能#
在过去的 5.* 时代里,php 的性能是不可描述的。
充其量也就是一般。
但是,在 7.0 版本中,PHP 核心的很大一部分被从头开始重写,导致性能提高了两三倍。
此外,每个 7.* 版本都对性能产生了积极影响。
不过,光靠语言是不够的。
让我们来看看基准测试。
幸运的是,其他人已经花了大量时间对 PHP 性能进行基准测试。
我发现 Kinsta 有一个很好的测评文章。
与性能相关的最新特性称为预加载,它基本上允许您将编译后的 PHP 代码部分存储在内存中。
你可以看看这里的一些基准。
当 PHP8 问世时,我们还将拥有一个 JIT 编译器,承诺进行有趣的性能改进,并允许 PHP 进入 web 开发以外的新领域。
框架和生态系统#
接下来介绍社区使用 PHP 所做的工作。
让我们明确一下:恰恰相反,PHP 不再仅仅是 WordPress。
一般来说,有两个主要的 Web 应用程序框架,以及一些较小的框架:symfony 和 Laravel。
当然也有 Lamina,Yii,Cake,Code igniter 等等–但是如果你想知道现代 PHP 开发是什么样子,前两个中的一个是不错的。
这两个框架都有一个庞大的软件包和产品生态系统。
从管理面板和 CRM 到独立的软件包,CI 到分析器,无数的服务,如 WebSockets 服务器,队列管理器,支付集成;老实说,有太多的东西要列出。
这些框架是为实际开发而设计的;如果您需要纯粹的内容管理,WordPress、CraftCMS 和 Static 等平台正在不断改进。
衡量 PHP 生态系统当前状态的一种方法是查看 PHP 的主包存储库 Packagist。
它经历了指数级的增长。
每天的下载量为 ±2500 万次,可以公平地说 PHP 生态系统不再像过去那样处于劣势了。
请看此图,其中列出了一段时间内软件包和版本的数量。
它也可以在 Packagist^2 ^ 网站上找到。
除了应用程序框架和 CMS 之外,我们还看到异步框架在过去几年中的兴起。
这些是用 PHP 或其他语言编写的框架和服务器,允许用户运行真正异步的 PHP 代码。
一些主要的玩家是 Swoole,Amp 和 ReactPHP。
自从我们冒险进入异步世界以来,像 websockets 和具有大量 IO 的应用程序这样的东西实际上已经与 PHP 世界相关了。
也有关于将 libuv 添加到核心的内部邮件列表的讨论。
对于那些没有意识到 libuv 的人来说:它与 Node.js 用来允许其所有异步性的库相同。
谁知道呢?
PHP8 可能是将其添加到核心的版本!
写在最后#
我希望我能够向您展示 PHP 在过去几年中有了巨大的发展,您完全能够用它编写干净和可维护的代码。
如果您对目前流行的 PHP 代码感兴趣,可以查看我自己的一个项目的源代码,以及我们亲自维护的许多开放源码包。
因此,虽然这门语言肯定有它的缺点和 20 年的历史遗产,但我可以自信地说,我喜欢使用它。
根据我的经验,我能够创建可靠的、可维护的、高质量的软件。
我为之工作的客户对最终结果很满意,我也是。虽然仍然有可能用 PHP 做很多乱七八糟的事情,但我想说,如果使用得当,它仍是 Web 开发的一个很好的选择。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: