PHP语言结构和函数的区别,PHP中的语言构造和“内置”函数有什么区别?

c51c386522e01630bc211eb1ae35093b.png

偶然的你

(这比我预想的要长;请耐心等待。)大多数语言都由称为“语法”的东西组成:语言由几个明确定义的关键字组成,您可以使用该语法构建完整的语言表达式。例如,假设你有一个简单的四函数算术“语言”,它只需要一位数的整数作为输入,完全忽略了操作的顺序(我告诉你它是一种简单的语言)。该语言可以通过以下语法定义:// The | means "or" and the := represents definition$expression := $number | $expression $operator $expression$number := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9$operator := + | - | * | /根据这三个规则,您可以构建任意数量的单位输入算术表达式。然后,你可以写这句法,打破了任何有效的投入到它的组件类型(解析器$expression,$number或$operator),并用结果的交易。例如,表达式3 + 4 * 5可以分解如下:// Parentheses used for ease of explanation; they have no true syntactical meaning$expression = 3 + 4 * 5            = $expression $operator (4 * 5) // Expand into $exp $op $exp            = $number $operator $expression // Rewrite: $exp -> $num            = $number $operator $expression $operator $expression // Expand again            = $number $operator $number $operator $number // Rewrite again现在,我们在已定义的语言中为原始表达式提供了完全解析的语法。一旦我们有了这个,我们可以通过编写一个解析器来查找所有组合的结果$number $operator $number,并在我们只剩下一个时吐出一个结果$number。请注意,$expression在原始表达式的最终解析版本中没有留下任何构造。那是因为$expression在我们的语言中总是可以简化为其他事物的组合。PHP大致相同:语言结构被认为是我们$number或的等价物$operator。它们不能被简化为其他语言结构 ; 相反,它们是构建语言的基本单位。函数和语言结构之间的关键区别在于:解析器直接处理语言结构。它将函数简化为语言结构。语言构造可能需要或不需要括号的原因以及某些语法具有返回值的原因而其他语句不会完全取决于PHP解析器实现的特定技术细节。我不是很熟悉解析器的工作方式,所以我不能专门解决这些问题,但想象一下这个以这个开头的语言:$expression := ($expression) | ...实际上,这种语言可以自由地获取它找到的任何表达式并摆脱周围的括号。PHP(在这里我使用纯粹的猜测)可能会为其语言结构使用类似的东西:print("Hello")可能会print "Hello"在解析之前减少,反之亦然(语言定义可以添加括号以及去除它们)。这是为什么你不能重新定义像echo或者语言结构的根本原因print:它们被有效地硬编码到解析器中,而函数被映射到一组语言结构,并且解析器允许你在编译或运行时更改该映射替换您自己的一组语言结构或表达式。在一天结束时,构造和表达式之间的内部差异是这样的:语言构造由解析器理解和处理。在语法提供的同时,内置函数在解析之前被映射并简化为一组语言结构。更多信息:Backus-Naur形式,用于定义形式语言的语法(yacc使用此形式)编辑:通过阅读其他一些答案,人们可以提出好的观点。其中:内置语言比函数更快地调用。这是正确的,如果只是边际,因为PHP解释器在解析之前不需要将该函数映射到其语言内置的等价物。但是,在现代机器上,差异可以忽略不计。内置的语言绕过错误检查。这可能是也可能不是,这取决于每个内置的PHP内部实现。毫无疑问,通常情况下,函数会有更高级的错误检查和内置函数不具备的其他功能。语言结构不能用作函数回调。这是事实,因为构造不是函数。他们是独立的实体。当你对内置函数进行编码时,你不会编写一个带参数的函数 - 内置函数的语法由解析器直接处理,并被识别为内置函数而不是函数。(如果您考虑具有一流功能的语言,这可能更容易理解:实际上,您可以将函数作为对象传递。您不能使用内置函数来执行此操作。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值