8

我的任务是学习PHP,但有很多东西我不明白。例如,“变量函数”的概念不是我在其他任何地方看到的。还有许多其他示例,但为简洁起见,我找到了 PHPWTF,其中包含许多 PHP 特质的示例。

我使用过的大多数其他语言要么有正式规范(例如,Haskell 2010),要么至少有一篇关于其形式语义的研究论文(例如,用于 Javascript 的 this)。但是,我找不到任何可与 PHP 相媲美的东西。

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

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

我在 PHP 上找到的一篇论文是这篇关于其赋值语义的论文。这是该语言的一个非常小的片段,如果没有一些上下文,可能对我没有多大用处。还有一篇关于 'SaferPHP' 的论文,它可能必须与 PHP 的某些定义一起使用,尽管我看不到任何内容。

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

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

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

4

5 回答 5

3

似乎您不是在追求官方标准(例如,这可能对编写独立的符合标准的实现的人有用),而是为了让您能够连贯地理解它的语言的呈现。不幸的是,不可能有这样的事情,因为PHP 背后没有连贯的正式模型。它已经有机地成长,现在背负着不一致的问题,最臭名昭著的是函数和方法命名,还有一些小细节,比如什么是trueand false,以及其他类似的令人担忧的细节。

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

本文很好地介绍了使您想要的那种语义模型变得不可能的事物。(您可能想跳过开头的咆哮,直接进入PHP 特性的讨论。)还有很多很多其他类似的文本。引用:“PHP 最初是为非程序员明确设计的(而且,在字里行间,非程序);它并没有很好地摆脱它的根源。”

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

于 2013-12-15T14:57:39.887 回答
2

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

于 2014-07-25T13:48:47.580 回答
1

不直接解决您的问题,但解释了 PHP 变量背后的一些魔力。

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

于 2013-12-15T15:12:57.263 回答
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 框架
  • 暴饮暴食
  • 推进
  • 教义

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


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

于 2013-12-15T20:28:54.033 回答
0

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

于 2014-07-31T08:55:30.227 回答