2019 年的 PHP 是怎么样的,至少不是十年前的模样

2019-05-1810:58:33后端程序开发Comments3,372 views字数 4625阅读模式

Brent 承认 PHP 当前仍然存在一些问题,比如许多核心函数仍然有不一致的方法签名、配置设置还是令人困惑,但是以他自己的开发经验来看,他认为 PHP 是 Web 开发的绝佳选择,使用 PHP,他可以创建可靠、可维护和高质量的应用,并且自己与客户对最终结果都满意。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

文章中 Brent 关注于 PHP 这些年来发展得好的一面,他通过几下几点,说明“PHP 不再是十年前那一门糟糕的语言了”:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

  • PHP 正在积极开发,每年都会发布新版本
  • PHP 5 之后性能在不断提高
  • 有非常活跃的框架、包和平台组成的语言生态
  • PHP 在不断发展,过去几年中添加了许多新功能
  • 各种开发工具在过去几年中已经成熟,并且保持增长

PHP 正在积极开发,每年都会发布新版本文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

当前 PHP 版本是去年 12 月份发布的 7.3,7.4 预计在今年年底发布,而 PHP 8.0 将是 7.4 之后的下一个版本。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

BranchInitial ReleaseActive Support UntilSecurity Support Until
7.11 Dec 20162 years, 5 months ago1 Dec 20185 months ago1 Dec 2019in 6 months
7.230 Nov 20171 year, 5 months ago30 Nov 2019in 6 months30 Nov 2020in 1 year, 6 months
7.36 Dec 20185 months ago6 Dec 2020in 1 year, 6 months6 Dec 2021in 2 years, 6 months

自从 5.X 时代以来,核心团队希望每年发布一个新版本,在过去四年中他们成功维护了这么一个发布周期。通常每个新版本都会得到官方两年时间的积极支持,之后有一年仅提供安全修复,其目的是激励 PHP 开发人员尽可能保持更新。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

2019 年的 PHP 是怎么样的,至少不是十年前的模样文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

更加具体的发布与维护周期可以查看 PHP 官网的介绍:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

看到上边这个表,你可能会发现版本号从 5 跳到了 7,那 PHP 6 去哪里了?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

顺便科普一下。其实早在 2005 年,PHP 社区就发起了 PHP 6,但由于实现 Unicode 面临的困难太大,项目最终流产,PHP 官方没有发布 PHP 6 GA,并且在 2010 年将 PHP 6 取消。虽然 PHP 6 项目取消了,但其大量已实现功能集成到了 PHP 5.X 中,包括 OOP 方面的改进,使得 PHP 从面向过程跨越到面向对象。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

PHP 6 被取消了,但是之前对这个主要版本的研发都是以 PHP 6 的名义进行的,所以许多参考资料与书籍都是用“PHP 6”来指代该版本。官方担心这在放弃 PHP 6 之后会引起混乱,于是干脆不使用 PHP 6.X 版本号,直接从 5 跳到 7。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

详情可以查看官方说明:https://wiki.php.net/rfc/php6文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

PHP 5 之后性能在不断提高文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

PHP 7.0 中,PHP 核心部分完全重写,带来了最新的 Zend 引擎,使得 PHP 性能提升了两到三倍。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

作者引用了 https://kinsta.com/blog/php-benchmarks 的基准测试来说明这一点,指出自 7.0 以来,PHP 性能一直在提升,PHP Web 应用与其它语言的 Web 框架相比在一些情况下性能好很多。但他也表示:“当然 PHP 框架不会胜过 C 与 Rust,但比 Rails 或 Django 好得多,与 ExpressJS 相当。”文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

有非常活跃的框架、包和平台组成的语言生态文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

提到 PHP 的框架,不得不说 WordPress,但是作者表示 WordPress 绝对不代表当前的 PHP 生态:“PHP 框架再也不仅仅只有 WordPress 了”。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

当前 PHP 中有两个主要的 Web 应用开发框架:Symfony 与 Laravel,还有 ZendYiiCakePHP 与 Code Igniter 等,此外还有不少较小的框架。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

Symfony 与 Laravel 都拥有庞大的包和软件生态,包括 admin 面板和 CRM、独立软件包、CI、分析器、Web socket 服务器、队列管理器与支付集成等。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

此外,近几年 PHP 异步框架也兴起了,SwooleAmp 与 ReactPHP 是其中的佼佼者,它们是用 PHP 或其它语言编写的框架和服务器,用来运行真正的异步 PHP。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

作者认为衡量 PHP 生态当前状况的一种方法是查看 Packagist 这个 PHP 主要软件包存储库的数据。通过以下趋势图,可以发现软件包数量呈指数增长,并且当前录入软件包有 223 217 个,总的安装量达到了 14 827 204 847,PHP 生态已不再像以前那么弱小。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

2019 年的 PHP 是怎么样的,至少不是十年前的模样文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

各种版本的可用软件包的数量文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

2019 年的 PHP 是怎么样的,至少不是十年前的模样文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

每月包被安装数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

2019 年的 PHP 是怎么样的,至少不是十年前的模样文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

此外,还可以看看这个 PHP 使用统计与市场定位最新数据:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

PHP 在不断发展,过去几年中添加了许多新特性文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

尽管 async 与 await 这两个呼声极高的特性还没有实现,但是 PHP 这几年新特性不断出现,语言本身得到了各方面的改进。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

下边列出了一些关注度比较高的 PHP 新特性:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

短闭包,也称为箭头函数,这是一种在 PHP 中编写较短函数的方法。将闭包传递给 array_map 或 array_filter 等函数时,它可以发挥极大的作用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

// A collection of Post objects $posts = [/* … */];

$ids = array_map(fn($post) => $post->id, $posts);

空合并运算符,它类似于三元运算符,但左边的操作数行为类似于 isset,而不是仅使用其布尔值。这使得此运算符对数组特别有用。它同时可在未设置变量时分配默认值。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

$undefined ?? 'fallback'; // 'fallback'

$unassigned;
$unassigned ?? 'fallback'; // 'fallback'

$assigned = 'foo';
$assigned ?? 'fallback'; // 'foo'

'' ?? 'fallback'; // ''
'foo' ?? 'fallback'; // 'foo'
'0' ?? 'fallback'; // '0'
0 ?? 'fallback'; // 0
false ?? 'fallback'; // false

Trait 是一种重用代码的机制,它可以减少单继承的某些限制。Traits 与类组合的语义定义了降低复杂性的方式,并避免了与多重继承和 Mixins 相关的典型问题。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

Trait 类似于类,但仅用于以细粒度和一致的方式对函数进行分组,它是对传统继承的补充,可以实现行为的横向组合,类成员应用不需要继承。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

<?php
trait ezcReflectionReturnInfo {
    function getReturnType() { /*1*/ }
    function getReturnDescription() { /*2*/ }
}

class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;
    /* ... */
}

class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* ... */
}
?>

属性类型化,类变量可以定义类型,比如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

class A
{
    public string $name;
    
    public Foo $foo;
}

扩展运算符,这是一种新语法,可以直接在调用中解压缩参数,比如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

call_user_func_array([$db, 'query'], array_merge(array($query), $params));

直接用新语法可扩展出数组 $params:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

$db->query($query, ...$params);

JIT 是一种编译器策略,它将代码表述为一种中间状态,在运行时将其转换为依赖于体系结构的机器码,并即时执行。在 PHP 中,这意味着 JIT 将为 Zend VM 生成的指令视为中间表述,并以依赖于体系结构的机器码执行,也就是说托管代码的不再是 Zend VM,而是更为底层的 CPU。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

Foreign Function Interface,外部函数接口,它允许从纯脚本语言调用 C 函数、使用 C 数据类型,从而更有效地开发“系统代码”。对于 PHP,FFI 开辟了一种使用纯 PHP 编写 PHP 扩展和绑定到 C 库的方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

匿名类,用于创建简单的一次性对象:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

<?php

// Pre PHP 7 code
class Logger
{
    public function log($msg)
    {
        echo $msg;
    }
}

$util->setLogger(new Logger());

// PHP 7+ code
$util->setLogger(new class {
    public function log($msg)
    {
        echo $msg;
    }
});

声明返回类型:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

<?php
function sum($a, $b): float {
    return $a + $b;
}

// Note that a float will be returned.
var_dump(sum(1, 2));
?>

严格模式:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

<?php
declare(strict_types=1);

function sum($a, $b): int {
    return $a + $b;
}

var_dump(sum(1, 2));
var_dump(sum(1, 2.5));
?>

使 Libsodium 成为核心扩展,Libsodium 是一个现代加密库,由安全专家精心选择的加密算法组成,以避免侧信道漏洞。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

生成器,提供了一种简单、无样板实现迭代器的方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

各种开发工具在过去几年中已经成熟,并且保持增长文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

最后一部分,作者分析了当前 PHP 开发工具也在不断成熟,并且保持增长。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

他以静态分析器为例,比如 PsalmPhan 与 PHPStan,这些工具将静态分析 PHP 代码并报告任何类型错误与可能存在的 bug。在某种程度上,它们提供的功能可以与 TypeScript 的相媲美,但是因为 PHP 现在不提供转换(transpile),所以不允许使用自定义语法。这意味着 PHP 开发需要依赖文档,但其实 PHP 的创造者 Rasmus Lerdorf 曾经提到了向核心添加静态分析引擎的想法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

受到 JavaScript 社区的启发,目前 PHP 也有在进行转换的相关研发,比如项目 Pre,它允许新的 PHP 语法转换为普通的 PHP 代码。虽然这个想法已经在 JavaScript 中被证明可行,但作者认为在 PHP 中,只有先提供了适当的 IDE 和静态分析支持,它才有可能实现。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

讲完了 PHP 当前的这些变化,作者最后没有以“PHP 是世界上最好的语言”作结语,相反,他是这样说的:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

All that being said, feel free to still think of PHP as a crappy language... I can say in confidence that I enjoy working with it.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

话虽如此,但是还要继续认为 PHP 是蹩脚的语言那也是可以的。我可以很自信地说我喜欢 PHP。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/12599.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/12599.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定