(这比我打算的要长;请耐心等待。)

大多数语言是由一种称为“语法”的东西组成的:该语言由几个定义明确的关键字组成,并且可以使用该语法构建用该语言构造的完整表达范围。

例如,假设您有一个简单的四功能算术“语言”,仅将一位整数作为输入,而完全忽略运算顺序(我告诉过您这是一种简单的语言)。该语言可以通过以下语法定义:

// 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大致相同:语言结构被认为与我们的$numberor 等效$operator。它们不能简化为其他语言结构 ; 相反,它们是构建语言的基础单元。函数和语言构造之间的主要区别在于:解析器直接处理语言构造。它将功能简化为语言结构。

语言构造可能需要或可能不需要括号的原因,以及某些具有返回值而另一些则不完全取决于PHP解析器实现的特定技术细节的原因。我对解析器的工作方式并不精通,因此我无法具体解决这些问题,但是请再想一想以这种语言开头的语言:

$expression:=($expression)|...

实际上,这种语言可以自由地使用找到的任何表达式并摆脱周围的括号。PHP(在这里我使用纯粹的猜测方法)对其语言结构可能采用类似的方式:print("Hello")可能会简化为print "Hello"解析之前的语言,反之亦然(语言定义可以添加括号,也可以删除括号)。

这就是为什么您无法重新定义诸如echo或的语言构造的根源print:它们已经有效地硬编码到了解析器中,而函数却映射到了一组语言构造,并且解析器允许您在编译时或运行时将该映射更改为替换您自己的一组语言构造或表达式。

归根结底,构造和表达式之间的内部区别是:解析器可以理解和处理语言构造。虽然内置功能由语言提供,但在解析之前会被映射并简化为一组语言结构。

更多信息:

Backus-Naur形式,用于定义形式语言的语法(yacc使用此形式)

编辑:通读一些其他答案,人们会指出自己的观点。其中:

内置的语言比函数调用起来更快。这是正确的,即使只是微不足道的,因为PHP解释器在解析之前不需要将该函数映射到其语言内置的等效项。但是,在现代机器上,差异几乎可以忽略不计。

内置语言绕过错误检查。这可能是正确的,也可能不是正确的,具体取决于每个内置的PHP内部实现。的确,很多时候函数会具有更高级的错误检查以及内建函数没有的其他功能,这是事实。

语言构造不能用作函数回调。的确如此,因为构造不是函数。他们是独立的实体。当您对内置函数进行编码时,您并不是在对带有参数的函数进行编码-内置函数的语法直接由解析器处理,并且被识别为内置函数,而不是函数。(如果您考虑使用具有一流功能的语言,这可能会更容易理解:有效地,您可以将功能作为对象传递。您不能使用内置函数做到这一点。)

php内置函数什么语言,语言构造和PHP中的“内置”函数有什么区别?相关推荐

  1. C语言试题五十二之学生的记录由学号和成绩组称个,n名大学生得数据已在主函数中放入结构体数组a中,请编写函数fun,它的功能时:按分数的高低排列学生的记录,高分在前。

    1. 题目 请编写一个函数void function(Student a[], int n),其功能时:学生的记录由学号和成绩组称个,n名大学生得数据已在主函数中放入结构体数组a中,请编写函数fun, ...

  2. c语言定义小数无穷小,OC中常用的数学函数以及浮点处理函数

    在编程中我们总要进行一些数学运算以及数字处理,尤其是浮点数的运算和处理,这篇文章主要介绍C语言下的数学库.而其他语言中的数学库函数的定义以及最终实现也是通过对C数学库的调用来完成的,其内容大同小异,因 ...

  3. python函数isdisjoint方法_Python学习之---Python中的内置函数(方法)(更新中。。。)...

    add(item)#将item添加到s中,如果item已经在s中,则无任何效果 break#退出循环,不会再运行循环中余下的代码 bool()#将参数转换为布尔型 bytes()#将值转成bytes类 ...

  4. length函数的头文件_Framebuffer 应用编程中涉及的 API 函数

    本节程序的目的是:打开 LCD 设备节点,获取分辨率等参数,映射 Framebuffer,最后实现描点函数. 5.2.1 open 函数 在 Ubuntu 中执行"man 2 open&qu ...

  5. python用函数绘制椭圆_详解opencv中画圆circle函数和椭圆ellipse函数

    1. void ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, doub ...

  6. excel函数:汉字转全拼_30天中30个Excel函数:01 –精确

    excel函数:汉字转全拼 Welcome to the Contextures 30 Excel Functions in 30 Days (30XL30D) challenge. Thanks f ...

  7. matlab绘制两个函数,用matlab程序 在同一图中绘制两个函数,这两个函数分别是: , ,,matlab怎样同时画出两个函数图...

    导航:网站首页 > 用matlab程序 在同一图中绘制两个函数,这两个函数分别是: , ,,matlab怎样同时画出两个函数图 用matlab程序 在同一图中绘制两个函数,这两个函数分别是: , ...

  8. 计算机hash函数开题报告,自组网位置服务中基于哈希函数的位置分配和检索方法【开题报告+文献综述+毕业论文】...

    自组网位置服务中基于哈希函数的位置分配和检索方法[开题报告+文献综述+毕业论文] (36页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 29.90 积分 ...

  9. java split函数的用法,java拆分字符串_java中split拆分字符串函数用法

    摘要 腾兴网为您分享:java中split拆分字符串函数用法,中信期货,掌上电力,星球联盟,淘集集等软件知识,以及韩剧精灵,每日英语听力vip,龙卷风收音机,优衣库,中国平煤神马集团协同办公系统,光晕 ...

  10. c语言getline作用,C/C++中常用的getline函数

    一直纠结怎么区分getline(), fgets(),gets()以及C语言中得getline()函数,今天稍微整理一下. 1.c++中得getline()函数: 这个使用的是string 的IO操作 ...

最新文章

  1. C++运算符重载形式--成员函数or友元函数?
  2. python 画图 线标注_Python画图的这几种方法,你学会了吗
  3. Hadoop源码解读系列目录
  4. qnetworkreply 获取状态_谈谈Unity Shader中的采样器状态和(Texture Filtering)纹理滤波方式
  5. laravel validate 设置为中文(验证提示为中文)
  6. URLDecoder与URLDecoder的简单了解
  7. 13.软件架构设计:大型网站技术架构与业务架构融合之道 --- 业务意识
  8. Ubuntu的HBase2.2.2安装
  9. VTK:图形基本操作进阶——表面重建技术(等值面提取)
  10. 申宝优配-指数缩量大跌
  11. linux下smbd服务,Linux下资源共享服务之samba 的讲解!
  12. java mail张_javaMail操作QQ邮箱发送邮箱 Demo
  13. jQuery实现AJAX定时刷新局部页面实例
  14. 导致项目进度延误的三种常见场景及解决方案
  15. 关于移动端IOS input弹起键盘时,引起高度问题
  16. 自己初步了解python数据爬虫
  17. Mac下如何用SSH连接远程Linux服务器
  18. SpringBoot配置多数据源(MySQL+SQLServer)
  19. 第二次阅读作业--12061161 赵梓皓
  20. 网众无盘多服务器,网众无盘多配置建立方案

热门文章

  1. Filter转译编码问题之谜
  2. ArrayList Vector LinkedList 区别与用法
  3. ISA Server中***客户端打开非80端口网站速度慢的解决访问
  4. ios怎么引入masonry_iOS-Masonry的简单使用
  5. python查看系统信息_Python脚本获取操作系统版本信息
  6. maven实现RBAC权限管理,实现不同角色下对应不同菜单
  7. python avg_Python:作用域、闭包、装饰器
  8. ASP.NET读取自定义的config文件
  9. asp.net中如何解决4M以上文件的上传
  10. Linux虚拟机设置Samba服务