PHP:什么是语言结构,为什么我们需要它们?

20
我经常看到这样的说法:
"echo是语言结构,而print是函数,因此它具有返回值"
以及
"die是语言结构"
我的问题是什么是语言结构,更重要的是我们为什么需要它们?

“print” 也是一种语言结构。它有一个值,但实际上不是返回值。这个值使得在同一语句中将“print”与其他指令组合成为可能。你可以通过它不需要括号来识别“print”作为一种语言结构。 - Manngo
7个回答

29

PHP语言的语言构造是硬编码的,它们不遵循常规规则。

例如,如果您尝试访问不存在的变量,将会得到一个错误。要在访问变量之前测试它是否存在,您需要使用 issetempty 函数:

if (isset($foo))
如果 isset 是一个普通的函数,你也会在这里得到一个警告,因为你正在访问 $foo 并将其传递给函数 isset。但是由于 isset 是一种语言结构,所以它可以正常工作而不会引发警告。这就是为什么文档清楚地区分普通函数和语言结构的原因。

12

语言结构是组成语言的要素:例如“if”、“for”、“while”、“function”等。

PHP手册中提到的“echo”、“die”或“return”等内容是为了表明它们不是函数,并且它们的行为并不总是像函数一样。

初学者可能会将“echo”称为“echo()”,这可能会导致困惑。这就是为什么他们在手册中清楚地区分它们的原因。以便让每个人都能理解。

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


5
不幸的是,PHP手册中语言结构的句法描述也很令人困惑。只需看看echo的描述:它说void echo ( string $arg1 [, string $... ] )但是 echo ($arg1, $arg2);是无效的。 - Gumbo

6
为了理解这个问题的答案,您必须先理解解析器的工作原理。语言的定义取决于其语法,而语法通过关键字来定义。
语言结构是组成PHP语言基础的代码块。解析器直接处理它们而不是函数。

4

并非所有语言都是由函数构成的。必须有一些基础,用于实现那些最初的函数。这个基础的元素就是语言结构(或者说内置函数)。它们的行为不总是像“普通”函数那样。


3
为了完整起见,语言结构是指内置于语言本身的任何指令,而函数是一段额外的代码块。
在某些情况下,一种语言可能选择构建特定功能或依赖于单独的函数。
例如,PHP有print语言结构,用于输出字符串。许多其他语言,如C,不会构建它,而是将其实现为函数。采取一种方法可能存在技术原因,但有时更具哲学意义——是否应将该功能视为核心或附加功能。
对于实际目的,虽然函数遵循一套严格的逻辑规则,但语言结构并不遵循。有时,这是因为它们可能正在执行某些通常会使常规函数受到影响的操作。例如,isset(…)由于其目的本身,可能引用不存在的内容。函数无法很好地处理这种情况。
以下是一些语言结构的特点:
  • 许多不需要括号;有些时候需要
  • 语言结构在不同的阶段进行处理;函数稍后处理
  • 一些语言结构(例如isset)执行函数无法执行的操作;另一些(例如Array(…))则可采用两种方式之一。
  • 有些语言结构看起来肯定不像函数。例如,Array(…)结构可以写成[...]
  • 正如文档一直提醒我们的那样,语言结构不能作为变量变量引用。因此,$a ='print_r'; $a(…);是可以的,但$a ='print'; $a(…);则不行。

2
一些事情使用普通函数是不可能完成的,考虑以下代码片段: list($el1, $el2) = array('el1', 'el2'); 它从一个非关联数组中获取元素,并将这些值分配给在list()结构中定义的变量。
这是使用函数无法实现的简单操作 :)
更微妙的例子是issetempty。虽然它们看起来像函数,但有一件事是仅通过函数无法实现的——它们不会生成“未定义变量”或“未定义索引”的提示。

你可以使用isset重新实现empty函数:function empty(&$var) { return !isset($var) || !$var; } - Gumbo

2
语言构造可以有多种形式并具有返回值。 print("asdf");print "asdf"; 一样,都会返回1。 echo("asdf"); 相当于 echo "asdf;",但没有返回值。 die("asdf"); 相当于 exit("asdf");,也没有返回值。

实际上,dieexit确实有一个值,但你永远看不到它。这就是为什么你可以在语句中使用它们,例如doSomething() or die('oops');or运算符需要在值之间。 - Manngo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接