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
本帖由 不正 于 4年前 加精
讨论数量: 1

php是世界上最好的语言

3年前 评论

php是世界上最好的语言

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!