在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是一种非常独特的语言:它仍然允许您编写完全动态且弱类型的代码,但还具有更强大的,选择加入类型的系统。结合静态分析以及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的类型系统中仍然缺少一个重要的功能:泛型。希望它们会被添加,但是还没有具体的方法。如果是类型化数组,则需要依靠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应用程序框架:Symfony和Laravel。当然,还有Laminas,Yii,Cake,Code Igniter等。但是,如果您想了解现代PHP开发的模样,那么使用前两种框架之一就可以了。
这两个框架都有一个庞大的软件包和产品生态系统。从管理面板和CRM到独立软件包,从CI到探查器,Web套接字服务器,队列管理器,支付集成等众多服务;老实说,这里有太多东西要列出。
这些框架是为实际开发而设计的。如果相反,您需要纯内容管理,则WordPress,CraftCMS和Statamic之类的平台正在不断改进。
衡量PHP生态系统当前状态的一种方法是查看Packagist,这是PHP的主要软件包存储库。它呈指数增长。每天有2500万次下载,可以说PHP生态系统已不再是过去的弱者。
看一下该图,列出随时间推移的软件包和版本数量。也可以在Packagist网站上找到它。
除了应用程序框架和CMS,过去几年中,我们还看到了异步框架的兴起。这些是用PHP或其他语言编写的框架和服务器,使用户可以运行真正的异步PHP代码。一些主要的参与者是Swoole,Amp和ReactPHP。
自从我们进入异步世界以来,Web套接字和具有大量IO的应用程序之类的东西实际上已经在PHP世界中变得重要起来。
在内部邮件列表上也有关于将libuv添加到核心的讨论。对于那些不了解libuv的人:它是Node.js用于允许其所有异步性的同一库。谁知道?PHP 8可能是将其添加到核心的版本!
结束语
我希望我能够向您展示PHP在过去的几年中取得了长足的发展,并且您完全能够用它编写干净且可维护的代码。
如果您对近来狂野的PHP代码感兴趣,可以查看我自己的项目之一的源代码,以及我们亲自维护的许多开源软件包。
因此,尽管该语言肯定有其缺点,并且具有20年的悠久历史;我可以自信地说我喜欢与它合作。
以我的经验,我能够创建可靠,可维护和高质量的软件。我为之工作的客户对最终结果感到满意,就像我一样。尽管使用PHP仍可以处理很多麻烦的事情,但我想如果明智和正确使用,它是Web开发的绝佳选择。
via : https://stitcher.io/blog/php-in-2020