P++ 是临时代号,可能会更改。
今日消息,不久前从 Zend 公司离职的 Zeev Suraski 以 PHP 开发组成员的身份提议要创建 PHP 方言,暂命名为 P++。

Zeev 表示,现有的 PHP 继续作为动态语言存在,而他提出的 PHP 方言暂命名为 P++,改成更严格的静态语言。他强调道,P++ 不是 PHP 的分叉。因为两者的代码库完全相同,维护代码库的开发者也会一样。另外,如果你安装了 PHP,那么将安装 P++,反之亦然。
总而言之,PHP 和 P++ 的绝大部分代码都是相同的。两者在特定差异点方面才会有不同的实现方式 —— 有点类似于 PHP 7 中的严格类型检查模式(strict_types),只不过 P++ 涉及的范围更广。
Zeev 还说到,动态语言和静态语言并无对错之分,这两种思想都是有价值的,然而创建一种同时迎合这两个人群的语言是一项挑战,这也是他提出 P++ 的原因之一。
所以 P++ 会有什么大胆的改进呢?据 Zeev 介绍,作为 PHP 的方言,P++ 会与 PHP 共存,但不会背负 PHP 语言背后的历史包袱。换句话说,这种新方言本质上可能会有更加严格的语法,它也会大胆移除被认为是负赘的元素,例如饱受诟病的短标签(short tags),并添加更复杂的功能 —— 尤其是那些非常适合强类型语言的特性,如此一来就无需为 PHP 引入相同的复杂性。
不过 Zeev 表示目前尚不清楚该如何标记一个文件为 P++ 文件,可能是在文件顶部的添加某种特殊的 header,例如:
<?p++?>
<?php 'Hello, world!'; ?>此外,他们可能会找到将整个名称空间标记为 P++ 的方法,因此框架不必将每个单独的文件明确标记为 P++。
那作为开发者的我们,是否需要在 PHP 和 P++ 之间做出选择?前文已提到,由于 PHP 和 P++ 会同时安装,所以从这个层面来说,开发者不存在该选 PHP 还是 P++ 的犹豫。
这是一份对在 internals@上提出的想法的常见问题澄清,它试图解决许多在随后讨论中被反复提出的问题。
注:P++ 是一个临时代码命名,未来可能会变化。
试图将冗长的邮件内容浓缩为几点:
这与短标签无关,“弃用短标签 RFC”不是这个想法的主要动力。这个提案的目标是更有野心,它是为 PHP 提供一个清晰的愿景,并希望通过向两个阵营提供他们想要的东西来最终解决两方的紧张关系。
这不是分叉。代码库将完全相同,它将由相同的人开发版本。二进制文件将完全相同,如果你安装 PHP,你也将安装 P++,反之亦然。相同的二进制将运行 PHP,P++ 或组合 PHP/P++ 的应用程序。
虽然目前还不清楚如何将一个文件“标记”为 P++ 文件,但它可能是文件顶部的某种特殊标记,例如:
<?p++?>
<?php 'Hello, world!'; ?>此外,我们可能会找到将整个命名空间标记为 P++ 的方法,因此,框架不必将每个单独的文件明确标记为 P++。
值得庆幸的是,这并不意味着是那样(工作量增加了一倍)。绝大多数代码将在 PHP 模式和 P++ 模式之间共享——包括源代码和运行时。
无论运行的文件是 PHP 还是 P++文件,数据结构、关键子系统、扩展、Web服务器接口、OPcache 以及其他所有代码都将是完全相同的代码。唯一的额外开发开销会是 PHP 和 P++ 之间的差异部分。
确实,这意味着我们必须维护某些代码片段的两个版本,并且我们在各个地方都会有一些 if() 语句,因为与 PHP 相比,P++ 可能会有额外的检查。但是,如果我们要转向更严格的 PHP 版本,这些元素无论如何都必须引入。此外,即使是严格阵营中的人,也不建议我们在没有提供迁移途径的情况下转向未来严格版本——实际上,这种方法所涉及的努力和几乎任何其他的方法都是相似的。
这种方法存在许多问题。即使我们忽视这样一个事实,即这会让庞大的动态偏好阵营悬而未决——没有任何特性或性能更新,从开发工作的角度来看,这是不切实际的。这与这个提议不同,事实上,这确实意味着事实上的分叉。
是,也不是。如上所述,当你安装一个,你就有了另一个,所以就应用而言,你可以在一台服务器上运行这两种方言。然而,实际上,项目和个人通常可能选择并标准化其中一个,类似于严格类型的情况。
是的。虽然我们需要确定精确的机制,但代码是 PHP 还是 P++ 的指定将在文件级别,而不是在请求级别。单个执行(请求)可以加载许多不同的文件,这些文件可以来自两种方言。PHP文件中的代码将表现为 PHP 语义——而来自 P++ 文件的代码将表现为 P++ 语义。这也是,与 strict_types 类似。
虽然这开始听起来可能听很尴尬,但可能会有非常实用的用例。例如,PHP 应用程序使用的只含 P++ 的框架,反之亦然。对于那些熟悉 C 和 C++ 的人来说,这有点类似。
不,这只是意味着它会以不同的方式发展。严格性和类型相关的功能可能只适用于 P++,并且只能在 P++ 文件中使用。向后兼容偏差将保留在 PHP 中(这并不意味着向后兼容永不会被打破,只是每个这样的案例必须有良好的投资回报案例)。
但是,与此无关的功能,例如引擎的性能改进(如 JIT ),扩展的开发,或新的异步相关的功能,PHP 和 P++ 都可以使用。
这种方法有很多好处。首先,它为 internals@ 的两个阵营提供了一个很好的解决方案。那些喜欢 PHP 动态特性的人可以保留它,而那些喜欢更严格类型语言的人也可以获得它,而不受任何 PHP 限制。而替代方案是零和游戏,一个阵营的胜利是另一个的失败,反之亦然。
除了设计一个好的技术解决方案(使我们能够以最少的努力支持整个受众)之外,还可以终结近年来 internals@ 上争论的关键根源。
最后,虽然本文档的大多数读者可能是技术人员,但应该注意的是,启动 P++ 将从一个新的基点不计过去重新开始,可能具有巨大的定位和品牌优势。未使用 PHP 的公司、开发经理和个人开发者更有可能注意到 P++ 的推出,而不是 PHP 8.0 或 PHP 9.0 的推出。
在某种程度上,我们是。但这不是这一想法的缺陷, 而是现实已经存在的表现。
如上所述,那里有很多人喜欢 PHP 的动态本质,并且谨慎地看待尝试使其越来越多地面向类型。
与此同时,还有另外一群看着 PHP 的人,自己在想:“为什么它变得如此缓慢,以至于我最终要放弃这动态的废材(原文:dynamic nonsense)?”
这里没有对或错。这两种观点都有效。当我们研究在这两个相互矛盾的观点之间架起桥梁的可能的解决方案时,没有太多可用的方案:
这两个想法之间有许多相似之处,但也存在一些实质性差异。请注意,这是基于对版本方法的有限理解,因此部分可能缺乏,不准确或不正确。
重要的是,要注意这两个想法不一定是相互排斥的。我们可以介绍 P++ 并使用版本进行改进,特别是当证明很难将所有重要的变化都放到 P++ 的第一期中。
在我们能运行第一个 P++ 应用程序之前,不乏挑战。
pplusplus/faq.txt · 最后修改:zeev 于 2019/08/09 21:44
(本文翻译为笔者原创 ,限于水平有限,如翻译中有不妥的地方请回复留言,如转载请注明出处: IT桃花岛 )