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 协议》,转载必须注明作者和本文链接
By: Laravel-China NiZerin Blog: nizer.in
本帖由 不正 于 5年前 加精