PHP形式语义?

时间:2013-12-15 14:39:18

标签: php formal-semantics

我的任务是学习PHP,但有很多事情我不明白。例如,the concept of "variable functions"不是我在其他任何地方见过的。还有很多其他的例子,但为了简洁起见,我找到了PHPWTF,其中有许多PHP特性的例子。

我使用的大多数其他语言都有正式规范(例如Haskell 2010)或至少有关于其形式语义的研究论文(例如this for Javascript)。但是,我找不到与PHP类似的东西。

有一个official "language reference"。但是,它非常非正式,读起来像维基,并且缺少整个部分(例如,the section on syntax根本没有定义语法)。确认我怀疑的是,this guy告诉我没有官方规范,甚至没有定义的语法。

维基百科有一篇关于"PHP syntax and semantics"的文章,但它只涉及语法,几乎没有提到语义。

我在PHP上发现的一篇论文是this paper on its assignment semantics。这是该语言的一个非常小的片段,如果没有某些语境,可能对我没什么用处。还有this paper on 'SaferPHP',可能必须使用PHP的某些定义,但我看不到任何定义。

口译员/编译器提供语义,所以我想看看这些。但是,the Zend source令人生畏(虽然它确实提供了useful test cases)和HipHop runs to 2.7 million LoC。 (我发现人们为编写一种语言的编译器付出了巨大的努力,而没有编写类似规范的东西。)

我想过为PHP寻找类型系统的指导,就像TypeScript为JavaScript提供一些指导一样。我找到了these tantalising slides on Hack,这是PHP的可选类型系统。然而,它只是幻灯片,此时该项目似乎是Facebook的内部项目。

有谁知道比这些穷人的语义更好的东西?或者每个人都只是“通过实例学习”?

5 个答案:

答案 0 :(得分:3)

似乎你没有遵循官方标准(例如,对于编写独立的符合性实现的人来说可能有用),但是对于能够让你对它有一致意义的语言的表达。不幸的是,不可能有这样的事情,因为 PHP背后没有一个连贯的正式模型。它有机地发展,现在背负着不一致,最臭名昭着的功能和方法命名,但也有一些细节比如truefalse以及其他同样令人担忧的细节。

在我看来,最好的方法是接近PHP,对于核心功能和库,对于需要注意的“问题”以及(为了阅读现有代码)感觉良好对于在现实世界的PHP脚本中非常常见的反模式而言,没有分心)。我的猜测是,最好在知道如何有效地使用它的人的指导下学习PHP,但我没有那么奢侈。 (关于文档:在我注意到你可以使用方括号来索引字符串之前我花了很长时间。这个特性可能会在文档中的某个地方提到,但至少在它所属的任何地方都可以提到。)

This article可以很好地浏览那些你想要的语义模型的东西。 (你可能想跳过开场咆哮并直接进入discussion of PHP features.)还有许多其他类似的文字。引用:“PHP最初是为非程序员明确设计的(并且,在行之间进行读取,非程序);它还没有完全逃脱它的根源。”

不要误会我的意思:我使用PHP,虽然这不是我最喜欢的语言,但我不会说我讨厌它。我说要有效地使用它,必须意识到它的性质和局限性。如果你是从哈斯克尔那里来的,你会非常震惊。

答案 1 :(得分:2)

在您的初始问题之后,这个答案有点过了,但现在我们终于有了PHP的正式语义。看看:http://www.phpsemantics.org。有关它的论文最近已在ECOOP 2014会议论文集中发表,如果您有兴趣,可以在我链接的网页中找到该链接。问候。

答案 2 :(得分:1)

不直接解决您的问题,但解释了PHP变量背后的一些神奇之处。

http://webandphp.com/how-php-manages-variables

答案 3 :(得分:1)

有趣的问题。我将手册视为官方语言参考;我很欣赏它在你所寻求的意义上并不是一个“正式的参考”,但我不知道这样的东西会被广泛广泛作为要学习的东西。

我对PHPWTF并不熟悉,但我猜它与博客文章Fractal Of Bad Design(由@alexis之前联系)相同。我无法深入了解任何作者的思想,但在我看来,它们是从想要 PHP的角度来写的。宗教战争经常在互联网和编程中占主导地位 - 您喜欢的浏览器,您使用的IDE /编辑器,您的操作系统和您选择的框架都具有相同的凶猛,党派和不屈不挠的待遇。遗憾的是,编程语言没有什么不同。

确实,PHP确实存在许多设计不一致性,尤其是关于如何处理空值以及标准函数中的参数排序。然而,尽管如此,PHP仍然取得了巨大的成功。它花了很长时间在5.0和5.1的可靠性低迷,5.2稳定但可以说不是企业,它最终在5.3以后成熟。

虽然这可能是我的偏见,但我感觉到我在Stack Overflow上读到的用户已达成共识,即所有流行语言都有其自己的位置。这部分是对我们不喜欢的事实不会消失的现实的回应,部分可能是学习.net,Java,Perl,Ruby,PHP,Python等几乎总是一个好的事情。也许我们也集体厌倦了每次的火焰战争(Java臃肿,PHP不一致,微软供应商锁定,Rails不稳定,等等)。

我倾向于偏离主题,但我倾向于认为这个特殊的观点值得一读,尤其对于那些传统上有意与PHP有关的人不同意。

为了解决问题的目的,您应该如何学习?那么,通过示例学习是一种很好的方法 - 只需要知道要学习哪些示例。搜索“PHP教程”和“PHP初学者” - 可能与任何语言的情况一样 - 提供优质和可怕材料的混合。有人可能会说,PHP的低进入门槛导致大量不安全且写得不好的“如何”文章,我当然看到了不少!

我认为解决方案是直接查看精心设计的项目中的代码,并从中学习。如:

  • Symfony2(和组件)
  • Zend Framework
  • 狂饮
  • 行走
  • 学说
啊,差点忘了; this website也是一个很好的起点。


Post Script:在其他语言中,它们可能会被另一个名称引用,但我希望它们都具有可变功能。例如,在JavaScript中,它是object[myFunc]();,其中myFunc是一个字符串。

答案 4 :(得分:0)

这不完全是正式的语义,但是,经过这么多年,HHVM项目产生了a PHP specification