在Web开发人员和程序员之间,这并不是什么秘密:PHP的声誉不高。尽管它仍然是构建Web应用程序的最常用语言之一;多年以来,PHP赢得了混乱的代码库,经验不足的开发人员,不安全的代码,不一致的核心库等的美誉。

尽管许多反对PHP的论据仍然存在,但还有一个光明的一面:您可以用PHP编写干净,可维护,快速和可靠的应用程序。

在这篇文章中,我想看看PHP开发的光明面。我想向您展示,尽管有很多缺点,PHP是一种值得学习的语言。我想让您知道PHP 5时代即将结束。那就是,如果您愿意的话,您可以编写现代而干净的PHP代码,并抛弃10年前的混乱局面。

因此,让我们看一下过去几年中语言是如何变化,甚至成熟的。我想请您搁置几分钟的偏见,而今天的PHP可能会让您感到惊讶。

让我们深入。

历史总结

在深入探讨细节之前,让我们回顾一下这些天如何开发PHP。我们现在的版本为7.4,而PHP8.0 将是2020年底将发布的下一个版本。

从5. *后期开始,核心团队就一直尝试保持一致的年度发布周期,并在过去四年中成功地做到了这一点。

总的来说,每个新版本都会得到两年的积极支持,并且会获得另一年的“仅安全修复”。目的是激励开发人员尽可能地保持最新状态:例如,每年进行小规模升级比在5.4到7.0之间跳跃要容易。

最后,PHP 5.6是最新的5. *版本,而下一个是7.0。如果您想了解PHP 6发生了什么,您可以收听PHP Roundtable podcast的这一集。

这些天PHP的开发是由一群志愿者完成的,其中一些由其雇主支付,以全职从事核心工作。关于语言如何演变的大多数讨论都在邮件列表中进行

综上所述,让我们揭露一些关于现代PHP的常见误解。

PHP的类型系统

PHP最初是一种非常弱的动态类型化语言,在当时具有其优势。自从人们开始将PHP用于较大的项目以来,其类型系统的缺点就变得很明显,因此需要更强大的类型支持。

如今,PHP是一种非常独特的语言:它仍然允许您编写完全动态且弱类型的代码,但还具有更强大的,选择加入类型的系统。结合静态分析以及PsalmPhanPHPStan等工具,您可以编写安全,强类型和静态分析的代码。

例如,完整地使用其现代类型系统,查看以下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的类型系统中仍然缺少一个重要的功能:泛型。希望它们会被添加,但是还没有具体的方法。如果是类型化数组,则需要依靠docblock来获得适当的IDE支持:

/** @var int[] */
public array $arrayOfInts = [];

尽管类型化数组是泛型的常见用例,可以用docblock解决,但是由于仍然缺少语言支持,所以我们还缺少许多功能。

PHP语法

在使PHP成为语法更成熟的语言方面,7。*时代已经做了很多事情。为了说明这一点,我在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有一个不错的更新列表。

最新的与性能相关的功能称为preloading,它基本上允许您将PHP代码的编译部分存储在内存中。您可以在此处查看一些基准。

当PHP 8到来时,我们还将提供一个JIT编译器供您使用,有望改善性能,并允许PHP进入Web开发之外的新领域。

框架与生态系统

继续学习社区使用 PHP 所做的事情。让我们清楚一点:相反,PHP不再只是WordPress。

通常,有两个主要的Web应用程序框架,以及一些较小的Web应用程序框架:SymfonyLaravel。当然,还有Laminas,Yii,Cake,Code Igniter等。但是,如果您想了解现代PHP开发的模样,那么使用前两种框架之一就可以了。

这两个框架都有一个庞大的软件包和产品生态系统。从管理面板和CRM到独立软件包,从CI到探查器,Web套接字服务器,队列管理器,支付集成等众多服务;老实说,这里有太多东西要列出。

这些框架是为实际开发而设计的。如果相反,您需要纯内容管理,则WordPress,CraftCMS和Statamic之类的平台正在不断改进。

衡量PHP生态系统当前状态的一种方法是查看Packagist,这是PHP的主要软件包存储库。它呈指数增长。每天有2500万次下载,可以说PHP生态系统已不再是过去的弱者。

看一下该图,列出随时间推移的软件包和版本数量。也可以在Packagist网站上找到它。

除了应用程序框架和CMS,过去几年中,我们还看到了异步框架的兴起。这些是用PHP或其他语言编写的框架和服务器,使用户可以运行真正的异步PHP代码。一些主要的参与者是SwooleAmpReactPHP

自从我们进入异步世界以来,Web套接字和具有大量IO的应用程序之类的东西实际上已经在PHP世界中变得重要起来。

在内部邮件列表上也有关于将libuv添加到核心的讨论。对于那些不了解libuv的人:它是Node.js用于允许其所有异步性的同一库。谁知道?PHP 8可能是将其添加到核心的版本!

结束语

我希望我能够向您展示PHP在过去的几年中取得了长足的发展,并且您完全能够用它编写干净且可维护的代码。

如果您对近来狂野的PHP代码感兴趣,可以查看我自己的项目之一的源代码,以及我们亲自维护的许多开源软件包

因此,尽管该语言肯定有其缺点,并且具有20年的悠久历史;我可以自信地说我喜欢与它合作。

以我的经验,我能够创建可靠,可维护和高质量的软件。我为之工作的客户对最终结果感到满意,就像我一样。尽管使用PHP仍可以处理很多麻烦的事情,但我想如果明智和正确使用,它是Web开发的绝佳选择。

via : https://stitcher.io/blog/php-in-2020

2020年的PHP
标签: