PHP形式语义


PHP formal semantics?

我的任务是学习PHP,但有很多事情我不懂。例如,"可变函数"的概念在其他任何地方都没有见过。还有很多其他的例子,但为了简洁起见,我找到了PHPWTF,它有很多PHP特性的例子。

我使用过的大多数其他语言要么有一个形式规范(例如Haskell 2010),要么至少有一篇关于其形式语义的研究论文(例如Javascript)。然而,我找不到任何与PHP类似的东西。

有一个官方的"语言参考"。然而,它是非常非正式的,读起来像维基,并且缺少整个部分(例如,语法部分根本没有定义语法)。这家伙告诉我,没有官方规范,甚至没有定义的语法,这证实了我的怀疑。

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

我在PHP上找到的一篇论文是关于它的赋值语义的。这是该语言的一个很小的片段,如果没有上下文,可能对我没有多大用处。还有一篇关于"SaferHP"的论文,它可能必须与PHP的一些定义一起工作,尽管我看不到任何定义。

解释器/编译器提供了语义,所以我想看看这些。然而,Zend源代码令人生畏(尽管它确实提供了有用的测试用例),HipHop运行了270万LoC。(我发现令人惊讶的是,人们在为一种语言编写编译器时投入了巨大的精力,却从未编写过规范之类的东西。)

我想看看PHP的类型系统以获得指导,就像TypeScript为JavaScript提供一些指导一样。我在Hack上发现了这些诱人的幻灯片,这是一个PHP的可选类型系统。然而,这只是幻灯片,这个项目现在似乎是Facebook的内部项目。

有人知道比这些穷人的语义更好的东西吗?还是每个人都只是"以身作则"

似乎你不是在追求官方标准(例如,对于编写独立一致性实现的人来说,这可能很有用),而是为了展示语言,让你能够连贯地理解它。不幸的是,不可能有这样的东西,因为PHP背后没有一个连贯的形式模型。它已经有机地发展起来,现在充满了不一致,最臭名昭著的是函数和方法命名,但也有一些小细节,比如truefalse,以及其他类似的令人担忧的细节。

在我看来,处理PHP最好的方法是对核心功能和库有一个良好的感觉,对你需要注意的"gotcha"有一个好的感觉,以及(为了阅读现有代码而不分心)对现实世界中PHP脚本中常见的反模式有一个很好的感觉。我的猜测是,最好在那些知道如何有效使用PHP的人的指导下学习PHP,但我没有这种奢侈。(关于文档:我花了很长时间才注意到可以使用方括号对字符串进行索引。文档中可能会提到该功能,但至少在当时,它所属的任何地方都不会提到。)

这篇文章很好地介绍了那些让你想要的语义模型变得不可能的事情。(你可能想跳过开头的咆哮,直接进入PHP功能的讨论。)还有很多其他类似的文本。引用:"PHP最初是为非程序员(从字里行间看,是非程序)明确设计的;它并没有很好地脱离其根源。"

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

这个答案是在您最初的问题之后给出的,但现在我们终于有了PHP的正式语义。看看:http://www.phpsemantics.org.最近在ECOOP 2014会议记录中发表了一篇关于它的论文,如果你感兴趣,你可以在我链接的网页中找到链接。当做

不直接处理您的查询,但解释了PHP变量背后的一些魔力。

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

有趣的问题。我认为手册是官方语言参考;我很感激它不是你所寻求的那种"正式的参考",但我不知道这样的东西会被广泛地作为学习的东西。

我对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不一致,微软锁定供应商,Rails不稳定,等等)。

我已经偏离了主题,但我倾向于认为这个特定的观点值得一读,尤其是对于那些传统上不同意PHP的人来说。

为了解决问题的目的,你应该如何学习?好吧,通过例子学习是一种很好的方法——人们只需要知道要学习哪些例子。搜索"PHP教程"answers"PHP初学者"将—也许任何语言都是如此;提供优秀和糟糕材料的混合。有人可能会说,PHP的低入门门槛导致了大量不安全和写得不好的"如何"文章,我肯定见过不少!

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

  • Symfony2(和组件)
  • Zend框架
  • Guzzle
  • 推进
  • 条令

啊,差点忘了;这个网站也是一个很好的起点。


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

这并不是一个正式的语义,但经过这么多年,HHVM项目已经产生了一个PHP规范!