PHP正式语义?

8
我被赋予学习PHP的任务,但有许多事情我不理解。例如,“可变函数”概念 是我在其他地方没有见过的。还有很多其他的例子,但为了简洁起见,我找到了PHPWTF,其中有许多PHP的怪异之处的例子。
我使用过的大多数其他语言都有正式规范(例如Haskell 2010)或至少有关于它们形式语义的研究论文(例如JavaScript的这篇文章)。然而,我找不到任何与PHP相媲美的东西。

这里有一个官方的语言参考。但是,这个参考非常不正式,读起来像维基百科,并且缺少整个部分(例如,语法部分根本没有定义语法)。正如我所怀疑的那样,这个人告诉我没有官方规范,甚至没有定义语法。

维基百科上有一篇关于"PHP语法和语义", 但它只涉及语法,几乎不提到语义。

我找到了一篇关于PHP的论文这篇关于其赋值语义的论文。这只是该语言的一个非常小的片段,如果没有一些上下文可能对我没有多大用处。还有这篇关于'SaferPHP'的论文, 可能必须使用某种定义的PHP才能工作,尽管我看不出来。

解释器/编译器提供语义,所以我想看看它们。然而,Zend源代码令人生畏(虽然它提供了有用的测试用例),而HipHop达到了270万行代码。(我觉得很惊奇,人们投入了巨大的精力来为一种语言编写编译器,却从未像规范那样编写过任何东西。)

我考虑查看PHP的类型系统,类似于TypeScript为JavaScript提供了一些指导。我在这里找到了这些诱人的幻灯片, 它们介绍了一个可选的PHP类型系统:Hack。不过,它只是幻灯片,该项目目前似乎是Facebook内部的。

是否有比这些简陋的语义更好的东西?或者每个人都只是“通过示例学习”?


1
据我所知,PHP的语义是由官方实现的行为定义的。 - Tim Seguine
3
“Formal Semantics”?别逗了。正如Tim所说,它是根据其功能定义的。而这个功能是“有机地”增长的(这是“哦,让我们添加这个很酷的功能”的委婉说法,就我所知,这主要是因为其他语言的嫉妒)。 - Ira Baxter
@IraBaxter:是的,看起来是这样。虽然我认为JavaScript也是如此,但它已经适应了一些形式化。也许PHP也可以。 - jameshfisher
1
PHP最好由其创造者Rasmus Lerdorf概括:“我绝对不知道如何编写编程语言,我只是在路上不断添加下一个逻辑步骤。”(来源:https://en.wikiquote.org/wiki/Rasmus_Lerdorf) - Boann
5个回答

3
看起来你并不是在寻找一个官方标准(例如对于编写独立符合实现的人可能很有用),而是寻找一种语言表达方式,使你能够理解它。不幸的是,这是不可能的,因为PHP没有一个连贯的形式模型支持它。它是有机发展的,并且现在充满了不一致性,最著名的是函数和方法命名,但也包括像什么算作truefalse等细节问题。
在我看来,最好的方法是了解核心特性和库、需要注意的“坑”,以及(为了不受干扰地阅读现有代码)现实世界PHP脚本中普遍存在的反模式。我的猜测是最好在懂得如何有效使用它的人的指导下学习PHP,但我没有那个奢侈条件。(关于文档:我花了很长时间才注意到可以使用方括号索引字符串。该功能可能在文档的某个地方提到过,但至少在当时没有出现在任何应该出现的地方。) 这篇文章很好地介绍了使你想要的语义模型成为不可能的事情。 (你可能想跳过开头的抱怨,直接进入PHP特性的讨论。)还有很多类似的文章。引用:“PHP最初是专门为非程序员(阅读之间的线索,非程序员)设计的;它没有逃脱其根源。” 不要误会:我使用PHP,虽然它不是我最喜欢的语言,但我不会说我讨厌它。我会说,为了有效地使用它,必须了解它的本质和限制。如果你从Haskell转来,你会感到相当震惊。

它的某些部分确实看起来很糟糕/复杂。我希望有像“轻量级PHP”(比如“轻量级Java”),或者“PHP的本质”(比如“Javascript的本质”)这样的东西。这种东西可以削减掉复杂的特性,以便严谨地解释其基本语义。Javascript也像PHP一样遭到了讽刺,但是事实证明,把它简化为最小化语言进行严格分析是可能的。 - jameshfisher
1
我正想问跟 OP 一样的问题(我有 PHP 方面的背景,希望深入了解这门语言)。我认为你的回答没理解问题的重点。是的,可能没有像“正式”的语法规则那样,但某些关键部分的行为方式仍然是确定的——比如参数传递、迭代器、作用域等。尽管有相当一部分 PHP 程序员可以不需要这方面的知识,但我还是相当肯定它在某个地方以某种方式被文档化了。 - Dexter
@Dexter,我的观点不是说没有文档,而是要被记录的行为并不连贯,因为它们都属于一个可以“理解”的统一模型。每个方面都不同。作用域的工作方式与命名空间不同。有很多概述,但任何文档都将是某种大型列表,而不是统一的模型。我可能对此有误解,但我认为我没有错过重点。 - alexis

2
此答案稍晚回复您的初始问题,但现在我们终于有了PHP的正式语义。请查看:http://www.phpsemantics.org。有关它的论文最近已经在ECOOP 2014会议记录中发表,如果您有兴趣,可以在我提供的链接网页上找到链接。顺祝商祺。

1

目前,我已经接受了这个答案,因为它实际上提供了有用的信息,而其他答案只是基于可疑的理由对问题进行了驳回。 - jameshfisher

1
有趣的问题。我认为手册是官方语言参考资料;我很感激它不完全是你所寻求的“正式参考”,但我不知道这种东西在多大程度上会被广泛需要作为学习的东西。
我不熟悉PHPWTF,但我猜测它与博客文章Fractal Of Bad Design(由@alexis提供链接)类似。我无法窥探任何作者的想法,但在我看来,它们似乎是从“想要”PHP表现得很差的角度写的。宗教战争经常主导网络和编程领域——你喜欢的浏览器、使用的IDE/编辑器、操作系统和框架选择都受到了同样凶猛、党派化和不妥协的对待。可悲的是,编程语言也不例外。
当然,PHP确实存在一些设计不一致之处,特别是关于如何处理null和标准函数中参数排序的问题。然而,尽管存在所有这些问题,PHP仍然取得了巨大的成功。它在5.0和5.1中花费了很长时间才摆脱可靠性困境,5.2虽然稳定但可能不适用于企业,而它终于在5.3及以后开始成熟。
虽然这可能是我的偏见,但我感觉在Stack Overflow上阅读的用户中存在一种共识,即所有流行的编程语言都有其用武之地。这部分是对我们讨厌的语言不会消失的现实的回应,另一部分或许是因为学习 .net、Java、Perl、Ruby、PHP、Python 等语言几乎总是一个好事情。也许我们已经集体厌倦了关于每个语言的争论(Java 很臃肿,PHP 不一致,Microsoft 是供应商锁定,Rails 不稳定,等等)。
我有些跑题了,但我倾向于认为这种特定观点值得一读,尤其是那些在涉及 PHP 时传统上倾向于不同意它的人。
针对你的问题目的,如何学习?嗯,通过示例学习是一种很好的方法——只需要知道要学习哪些示例。搜索“PHP 教程”和“PHP 初学者”将会——也许与任何语言一样——提供一些优秀和可怕的材料混合体。有人可能会认为,PHP 的低门槛导致了大量不安全和糟糕的“如何”文章,我确实看到过相当多!
我认为解决方案是直接查看来自良好工程项目的代码,并从中学习。比如:
  • Symfony2(和组件)
  • Zend框架
  • Guzzle
  • Propel
  • Doctrine

啊,几乎忘了; this website 也是一个很好的起点。


附言:在其他语言中可能会用不同的名称来引用它们,但我预计它们都具有可变函数。例如,在JavaScript中,它是object[myFunc]();,其中myFunc是一个字符串。


+1 针对 phptherightway 的链接,它看起来是一个不错的资源!话虽如此,OP 并不是在寻求好的文档,而是在寻找 PHP 的“形式语义”。Phptherightway 强调了 PHP 的最佳特性(而不是我提供的链接中的最差特性),但我没有看到任何可以作为该语言形式模型的资料。 - alexis
谢谢您的想法。我同意正式定义是问题的一部分,但“每个人都只是“通过示例学习”吗?”也是问题之一。我正确或错误地解释为“什么是一个好的学习方式”。顺便说一句,我认为正式/BNF规范很难学习,但这可能因人而异。 - halfer
我无法想象从BNF规范中学习,但是如果有一个文本描述,比如“这是一个表达式,这是一个语句,这是一个lvalue,这是一个引用,这是你在组合它们时得到的内容”,那会怎么样?例如,Python文档做得很好。但是,什么样的合理正式模型可以捕捉到在PHP中,func_get_args()不能用作函数参数的事实呢? - alexis
我之前不知道这个限制,但是手册上说从5.3版本开始这个限制已经不存在了。 - halfer
很高兴听到这个消息!对于修复了大部分这类问题的任何PHP版本来说,我的观点都将不再成立(而且有太多这种问题)。 - alexis

0

虽然不是完全正式的语义,但是经过这么多年,HHVM项目已经发布了PHP规范


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接