0

0

PHP新分支:P++,你还敢说php是弱类型语言吗?

PHPz

PHPz

发布时间:2019-08-12 22:16:52

|

10667人浏览过

|

来源于php中文网

原创

摘要:php 语言的创始人 rasmus lerdorf 生于 1968 年,今年已 51 岁,他在 1995 年以 personal home page tools 为名发布了 php 1.0。他的辉煌随着雅虎在搜索领域的颓败而黯淡。

1997 年,以色列程序员 Zeev Suraski 及 Andi Gutmans 加入了 Zend 公司 的 PHP 语言开发,发布了 PHP 3, PHP 4, PHP 5,注意没有 PHP 6,再到现在的 PHP 7。 1975 年出生的 Zeev Suraski 在 Zend 工作了 20 年。也许是在语言、架构和库的工作上找不到发展方向了。

前几天 Zeev Suraski 宣布从 Zend 离职,业界比较惊讶,PHP 7 优化的开发者鸟哥说是这是早已预定好的事。原来 Zeev Suraski 辞职,他想做 P++,那 P++ 是啥?他通过《P++ idea: FAQ》进行了回答,笔者作了全文翻译。

Suraski

原文翻译:

立即学习PHP免费学习笔记(深入)”;

这是一份对在 internals@(internals@:PHP 内部开发人员邮件列表。这里涉及 PHP 的开发机制,当内部讨论成熟后,会公开在 externals,通常用来提交 RFC 和发布版本通知。) 上提出的想法的常见问题澄清,它试图解决许多在随后讨论中被反复提出的问题。

注:P++ 是一个临时代码命名,未来可能会变化。

这到底是怎么回事?

试图将冗长的邮件内容浓缩为几点:

1. PHP 世界有两个大的阵营。第一个大致喜欢 PHP 的动态性,带有强烈的 BC偏见(BC:即 Backward Compatibility,向后兼容,也叫向下兼容,兼容过去的版本,即升级的软件要考虑旧版本的兼容性,比如,Office 2019 的 Word 默认使用 .docx 文件格式,但也可以打开 Office 2017/2013/2010,甚至是 2003 的 .doc 格式。相对的概念叫做 FC,即 Forward Compatibility,向前兼容,也叫向上兼容,即升级的软件会考虑对未来的兼容性。这在软件中通常为一个确定的接口和约定,未来依然遵循,即可实现向前兼容。),并特别强调简单性,另一个更喜欢减掉包袱,拥有更高级、更复杂功能的更严格的语言。

2. 这里没有“对”或“错”。这两种流派都有效,并具有非常坚定的追随者。然而,创建一种同时迎合这两个阵营的语言则是一项挑战,这也是 internals@ 上争论的一贯的原因。

3. 该提议是创建一种新的 PHP 方言(代码名 P++),与 PHP 并存,但不受语言背后的历史哲学约束。换句话说,这种新方言本质上可能更加严格,它可能会更加大胆地消除向后兼容,并删除被认为是“包袱”的元素(例如短标签),并添加更复杂的特性,尤其是那些非常适合严格类型化的语言的,而无需为 PHP 方言引入相同的复杂性。

4. 这不是 PHP 代码分支。代码库将是同一个,在该代码库上工作的开发人员是相同的。绝大多数代码都是相同的。只有两种方言之间的特定差异点才会有不同的实现。它有点类似于 PHP 7 中的 strict_types 所做的,只是在更大的范围内。

我们真的要做的就是因为有些人不能放弃短标签吗?

这与短标签无关,“弃用短标签 RFC(RFC:即 Request for Comments,语言特性的加入,以及标准化变更管理的方法,通常加入新特性时,会为新特性提交 RFC 并给出例子,变更委员会评估通过后,语言会合入实现的源码,并入新版本。)”不是这个想法的主要动力。这个提案的目标是更有野心,它是为 PHP 提供一个清晰的愿景,并希望通过向两个阵营提供他们想要的东西来最终解决两方的紧张关系。

为什么要分叉 PHP?

这不是分叉。 代码库将完全相同,它将由相同的人开发版本。二进制文件将完全相同,如果你安装 PHP,你也将安装 P++,反之亦然。相同的二进制将运行 PHP,P++ 或组合 PHP/P++ 的应用程序。

虽然目前还不清楚如何将一个文件“标记”为 P++ 文件,但它可能是文件顶部的某种特殊标记,例如:

<?p++?>
<?php 'Hello, world!'; ?>

此外,我们可能会找到将整个命名空间标记为 P++ 的方法,因此,框架不必将每个单独的文件明确标记为 P++。

这意味着我们的开发工作量增加了一倍,而 internals@ 的贡献者已经很低(low)了。 我们如何处理?

值得庆幸的是,这并不意味着是那样(工作量增加了一倍)。绝大多数代码将在 PHP 模式和 P++ 模式之间共享——包括源代码和运行时。

无论运行的文件是 PHP 还是 P++文件,数据结构、关键子系统、扩展、Web服务器接口、OPcache 以及其他所有代码都将是完全相同的代码。唯一的额外开发开销会是 PHP 和 P++ 之间的差异部分。

确实,这意味着我们必须维护某些代码片段的两个版本,并且我们在各个地方都会有一些 if() 语句,因为与 PHP 相比,P++ 可能会有额外的检查。 但是,如果我们要转向更严格的 PHP 版本,这些元素无论如何都必须引入。此外,即使是严格阵营中的人,也不建议我们在没有提供迁移途径的情况下转向未来严格版本——实际上,这种方法所涉及的努力和几乎任何其他的方法都是相似的。

当我们转向更严格的 PHP 8/9时, 为什么不只是开发一个永久维护的 PHP 7.4 长期维护版?

这种方法存在许多问题。 即使我们忽视这样一个事实,即这会让庞大的动态偏好阵营悬而未决——没有任何特性或性能更新,从开发工作的角度来看,这是不切实际的。 这与这个提议不同,事实上,这确实意味着事实上的分叉。

我需要在 PHP 和 P++ 之间做出选择吗?

是,也不是。 如上所述,当你安装一个,你就有了另一个,所以就应用而言,你可以在一台服务器上运行这两种方言。 然而,实际上,项目和个人通常可能选择并标准化其中一个,类似于严格类型的情况。

我能在同一个应用程序中混合使用 PHP 和 P++ 吗?

是的。 虽然我们需要确定精确的机制,但代码是 PHP 还是 P++ 的指定将在文件级别,而不是在请求级别。 单个执行(请求)可以加载许多不同的文件,这些文件可以来自两种方言。PHP文件中的代码将表现为 PHP 语义——而来自 P++ 文件的代码将表现为 P++ 语义。 这也是,与 strict_types 类似。

虽然这开始听起来可能听很尴尬,但可能会有非常实用的用例。例如,PHP 应用程序使用的只含 P++ 的框架,反之亦然。 对于那些熟悉 C 和 C++ 的人来说,这有点类似。

这是否意味着 PHP 将不再发展? 所有新功能都会用于 P++ 吗?

不,这只是意味着它会以不同的方式发展。 严格性和类型相关的功能可能只适用于 P++,并且只能在 P++ 文件中使用。向后兼容偏差将保留在 PHP 中(这并不意味着向后兼容永不会被打破,只是每个这样的案例必须有良好的投资回报案例)。

但是,与此无关的功能,例如引擎的性能改进(如 JIT ),扩展的开发,或新的异步相关的功能,PHP 和 P++ 都可以使用。

九歌
九歌

九歌--人工智能诗歌写作系统

下载

这个方法有什么好处?

这种方法有很多好处。 首先,它为 internals@ 的两个阵营提供了一个很好的解决方案。 那些喜欢 PHP 动态特性的人可以保留它,而那些喜欢更严格类型语言的人也可以获得它,而不受任何 PHP 限制。 而替代方案是零和游戏,一个阵营的胜利是另一个的失败,反之亦然。

除了设计一个好的技术解决方案(使我们能够以最少的努力支持整个受众)之外,还可以终结近年来 internals@ 上争论的关键根源。

最后,虽然本文档的大多数读者可能是技术人员,但应该注意的是,启动 P++ 将从一个新的基点译注4不计过去重新开始,可能具有巨大的定位和品牌优势。未使用 PHP 的公司、开发经理和个人开发者更有可能注意到 P++ 的推出,而不是 PHP 8.0 或 PHP 9.0 的推出。

我们不是冒着分裂用户群的风险吗?

在某种程度上,我们是。但这不是这一想法的缺陷, 而是现实已经存在的表现。

如上所述,那里有很多人喜欢 PHP 的动态本质,并且谨慎地看待尝试使其越来越多地面向类型。

与此同时,还有另外一群看着 PHP 的人,自己在想:“为什么它变得如此缓慢,以至于我最终要放弃这动态的废材(原文:dynamic nonsense)?”

这里没有对或错。这两种观点都有效。当我们研究在这两个相互矛盾的观点之间架起桥梁的可能的解决方案时,没有太多可用的方案:

1. 坚持使用动态PHP。这将不会被更严格语言的支持者所接受。

2. 向严格的PHP发展。动态语言的支持者不会接受这一点。

3. 分叉代码库。无论如何完成,都是所有参与者的净损失选项。 这样做没有技术优势,即使我们想要(我们不想要),我们也没有足够的贡献者去做。

4. 提出一些创意解决方案,以满足双方观众的需求。 这就是该提案试图做的。它在保持项目本身统一的同时,也确保两种方言之间的永久互操作性。这虽然会有一定程度的碎片化,但它仍然是满足每个人的主要需求的最小可能。

这与 Nikita(一位 internals@ 上的发言者,提议在版本中加入特性。顺便提一句,美剧《Nikita》值得一看。)版本的想法有何不同?

这两个想法之间有许多相似之处,但也存在一些实质性差异。 请注意,这是基于对版本方法的有限理解,因此部分可能缺乏,不准确或不正确。

1. 在这个提议中,有一个明确的目标是保持当前动态类型的 PHP,作为一个长期的,完全支持的,平等的对等方言。 发版本的方法将当前行为视为“遗留”。 这意味着它可能会被劝止(使用),然后在某些时候弃用和删除。

2. 推出策略完全不同。 P++ 提案旨在首先关注兼容性破坏元素,例如严格的操作、类型转换逻辑的更改、数组索引处理、需要变量声明等等,并且旨在在 P++ 的第一期提供它们。这样做的目的是允许新项目/框架重新开始,而不需知道在引入更多兼容性更改时,他们可能不得不在一两年内进行重大改写。 版本化提案似乎没有这样的目标,而是旨在逐步添加/更改 PHP 中的元素。

3. 与推出方式相关,版本化方法不允许只有两种方言,而是任何数量的方言。我们可能有 PHP2020 方言,以及 PHP2022 方言和 PHP2027 方言。 如果我们全部保留它们,实际上这可能会增加我们的维护复杂性。

4. 该提议还提到了 PHP 与 P++(保守与积极)的不同打破向后兼容策略,而版本化方案可能根本不会涉及该主题。

5. 版本提案与此提案的定位/营销方面并不完全相同。

重要的是,要注意这两个想法不一定是相互排斥的。 我们可以介绍 P++ 并使用版本进行改进,特别是当证明很难将所有重要的变化都放到 P++ 的第一期中。

有哪些挑战?

在我们能运行第一个 P++ 应用程序之前,不乏挑战。

1. 我们需要获得支持。这意味着,两派的人都需要放弃让 PHP 完全动态或完全类型化的梦想,而忽略那些与他们想法不同的人。这似乎是一个非常重大的挑战。

2. 为获得成功,P++ 第一个版本应该处理来自 PHP 的所有,或至少大多数兼容性破坏的更改,以便切换(可能相当痛苦)的开发人员不必在未来重新审核/彻底重构他们的代码。一些人表示担心,由于我们的开发人员能力有限,他们可能过于乐观,无法在一期发布。一旦我们对列表的内容有了更好的了解,我们就必须对此进行评估。 请注意,这并不意味着我们需要在第一个期中实现我们可能对 P++ 提出的所有想法,只是我们应该优先考虑会触发大量最终用户代码重写的元素,并尝试在我们的第一版之前处理它们。

3. 当然,最具挑战性的——我们需要为这种新方言找到一个合理的名字。

相关推荐:

1.  php是世界上最好的语言是什么梗

2. PHP早已不是十年前的鸟样

3. PHP 7.4预计将在2019年12月发布

4. 2019为什么我们还会继续使用 PHP?

5. 为什么程序员都黑php?PHP中文网有话说!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

3

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

12

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

69

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

59

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

46

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

24

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

20

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

4

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

348

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号