我不断遇到以下陈述:
echo
是一种语言结构,但 print 是一个函数,因此有一个返回值
和
die
是一种语言结构
我的问题是这些语言结构是什么,更重要的是我们为什么需要它们?
我不断遇到以下陈述:
echo
是一种语言结构,但 print 是一个函数,因此有一个返回值
和
die
是一种语言结构
我的问题是这些语言结构是什么,更重要的是我们为什么需要它们?
语言结构被硬编码到 PHP 语言中。他们不按正常规则玩。
例如,每当您尝试访问不存在的变量时,您都会收到错误消息。要在访问变量之前测试它是否存在,您需要咨询isset
或empty
:
if (isset($foo))
如果isset
是一个普通函数,你也会在那里收到警告,因为你正在访问$foo
将它传递给 function isset
。由于isset
是一种语言结构,因此它可以在不发出警告的情况下工作。这就是文档明确区分普通函数和语言结构的原因。
语言结构是语言的组成部分:诸如“if”“for”“while”“function”之类的东西。
PHP 手册中提到的诸如“echo”、“die”或“return”之类的东西是为了清楚地表明这些不是函数,并且它们的行为并不总是像函数一样。
您可以将“echo”称为“echo()”,这样可能会使初学者感到困惑。这就是他们在手册中明确区分的原因。让大家绝对清楚。
其他可能被误认为函数的语言结构示例是“array()”、“list()”和“each()”。
要理解这个问题的答案,您必须了解解析器的工作原理。语言是由语法定义的,语法是通过关键字定义的。
语言结构是构成 PHP 语言基础的代码片段。解析器直接处理它们而不是函数。
并非所有语言都可以是函数。必须有一些基础,在某个地方,您可以在其上实现这些第一个功能。这个基础的元素是语言结构(或者,内置的)。它们的行为并不总是像“正常”函数那样。
有些事情是不可能使用普通功能的,考虑这个片段:
list($el1, $el2) = array('el1', 'el2');
它的作用是从非关联数组中获取元素并将值分配给list()
构造中定义的变量。
根本不能用函数来完成:)
一个更微妙的例子是isset
and empty
。尽管它们看起来像函数,但它们是单独使用函数不可能实现的一件事——它们不会生成“变量未定义”或“未定义索引”通知。
为了完整起见,语言结构是语言本身内置的任何指令,而函数是附加的代码块。
在某些情况下,一种语言可能会选择构建特定功能或依赖单独的功能。
例如,PHP 具有print
输出字符串的语言结构。许多其他语言,例如C语言并没有内置它,而是将它实现为一个函数。采用一种或另一种方法可能存在技术原因,但有时它更具哲学意义——该功能应被视为核心还是附加。
出于实际目的,虽然函数遵循一组严格的逻辑规则,但语言结构却没有。有时,那是因为他们可能正在做一些会伤害常规功能的事情。例如, 就isset(…)
其目的而言,可能是在引用不存在的东西。函数根本不能很好地处理这个问题。
以下是语言结构的一些特征:
isset
做一些不可能作为函数的事情;其他一些,例如Array(…)
可能已经走了任何一条路。Array(…)
构造可以写为[…]
.$a='print_r'; $a(…);
可以,但$a='print'; $a(…);
不是。语言结构可以以不止一种方式形成,并且有一个返回值
print("asdf");
尽可能print "asdf";
并将返回 1。
echo("asdf");
等于echo "asdf;"
但没有返回值。
die("asdf");
等于exit("asdf");
并且也没有返回值。