17

我不断遇到以下陈述:

echo是一种语言结构,但 print 是一个函数,因此有一个返回值

die是一种语言结构

我的问题是这些语言结构是什么,更重要的是我们为什么需要它们?

4

7 回答 7

25

语言结构被硬编码到 PHP 语言中。他们不按正常规则玩。

例如,每当您尝试访问不存在的变量时,您都会收到错误消息。要在访问变量之前测试它是否存在,您需要咨询issetempty

if (isset($foo))

如果isset是一个普通函数,你也会在那里收到警告,因为你正在访问$foo将它传递给 function isset。由于isset是一种语言结构,因此它可以在不发出警告的情况下工作。这就是文档明确区分普通函数和语言结构的原因。

于 2010-07-15T09:48:43.283 回答
10

语言结构是语言的组成部分:诸如“if”“for”“while”“function”之类的东西。

PHP 手册中提到的诸如“echo”、“die”或“return”之类的东西是为了清楚地表明这些不是函数,并且它们的行为并不总是像函数一样。

您可以将“echo”称为“echo()”,这样可能会使初学者感到困惑。这就是他们在手册中明确区分的原因。让大家绝对清楚。

其他可能被误认为函数的语言结构示例是“array()”、“list()”和“each()”。

于 2010-07-15T09:45:48.610 回答
5

要理解这个问题的答案,您必须了解解析器的工作原理。语言是由语法定义的,语法是通过关键字定义的。

语言结构是构成 PHP 语言基础的代码片段。解析器直接处理它们而不是函数。

于 2010-07-15T10:04:23.963 回答
3

并非所有语言都可以是函数。必须有一些基础,在某个地方,您可以在其上实现这些第一个功能。这个基础的元素是语言结构(或者,内置的)。它们的行为并不总是像“正常”函数那样。

于 2010-07-15T09:46:34.100 回答
2

有些事情是不可能使用普通功能的,考虑这个片段:

list($el1, $el2) = array('el1', 'el2');

它的作用是从非关联数组中获取元素并将值分配给list()构造中定义的变量。

根本不能用函数来完成:)

一个更微妙的例子是issetand empty。尽管它们看起来像函数,但它们是单独使用函数不可能实现的一件事——它们不会生成“变量未定义”或“未定义索引”通知。

于 2010-07-15T09:44:31.147 回答
2

为了完整起见,语言结构是语言本身内置的任何指令,而函数是附加的代码块。

在某些情况下,一种语言可能会选择构建特定功能或依赖单独的功能。

例如,PHP 具有print输出字符串的语言结构。许多其他语言,例如C语言并没有内置它,而是将它实现为一个函数。采用一种或另一种方法可能存在技术原因,但有时它更具哲学意义——该功能应被视为核心还是附加。

出于实际目的,虽然函数遵循一组严格的逻辑规则,但语言结构却没有。有时,那是因为他们可能正在做一些会伤害常规功能的事情。例如, 就isset(…)其目的而言,可能是在引用不存在的东西。函数根本不能很好地处理这个问题。

以下是语言结构的一些特征:

  • 许多不需要括号。有些人有时会
  • 语言结构在不同的阶段进行处理;函数稍后处理
  • 一些语言结构,例如isset做一些不可能作为函数的事情;其他一些,例如Array(…)可能已经走了任何一条路。
  • 某些语言结构当然看起来不像函数。例如,该Array(…)构造可以写为[…].
  • 正如文档不断提醒我们的那样,语言结构不能作为变量变量引用。所以$a='print_r'; $a(…);可以,但$a='print'; $a(…);不是。
于 2019-03-03T08:00:20.337 回答
1

语言结构可以以不止一种方式形成,并且有一个返回值

print("asdf");尽可能print "asdf";并将返回 1。

echo("asdf");等于echo "asdf;"但没有返回值。

die("asdf");等于exit("asdf");并且也没有返回值。

于 2010-07-15T09:48:51.980 回答