请考虑以下代码段:
function f() {
return 'hi';
}
echo f();
与此片段相关:
echo f();
function f() {
return 'hi';
}
当我运行脚本时,它们都会产生相同的结果。那很好。
但是我的问题是(我在任何搜索中都找不到好的答案或参考),在定义之前调用函数是否可以(即从脚本文件的顺序解析角度来看)?
如果我将函数调用放在脚本文件中的函数定义块之前,我不想遇到任何问题或弃用。
答案 0 :(得分:10)
来自Manual:
之前不需要定义函数 它们被引用,除了a 函数有条件地定义为 如下面的两个例子所示。
在定义函数之前调用(引用)函数的可能性是一个PHP有意的特性,我认为你不必担心它会被弃用。
作为观察,如果您可以选择在之前或之后声明该功能,那么在使用它之前声明它是常识。
注意:以下代码会产生致命错误,因为该函数仅在运行时定义。
<?php
echo helloWorld();
if(1){
function helloWorld() {
return 'hello world';
}
}
?>
答案 1 :(得分:1)
编译器步骤如下:
因此,理解这一点的最简单方法仅仅是因为脚本不是多线程的,并不意味着它在一行中执行。
PHP在执行之前将您的整个源代码读入令牌,因为它可以控制令牌的顺序。
以此为例
while(true)
{
print '*';
}
每一行都是一系列字符,因此PHP会将其解释为
if #T_IF
#T_WHITESPACE
(
#T_WHITESPACE
true #T_STRING
#T_WHITESPACE
)
#T_WHITESPACE
{
#T_WHITESPACE
print #T_PRINT
#T_WHITESPACE
'*'; #T_CONSTANT_ESCAPED_STRING
#T_WHITESPACE
}
但仅仅因为它被阅读并不意味着它已被执行。
因此,函数位于列表的顶部,这样就可以执行它们,因为已经存在于系统内存中。
我认为这样做的原因是首先加载了PHP的本地库,如PFO,mysql_connect函数和类,并且它们会在本机实现之后移动所有用户定义的作用域。
在执行开始时加载。
答案 2 :(得分:0)
这是一个很好的问题。因为它没有一个非常好的答案。如果有机会,PHP会很好地向后工作。直到没有。例如,如果稍后在尚未加载的包含文件中定义该函数,则不会。 PHP将在代码中包含这些文件,因此在这种情况下您将得到一个未定义错误的函数。
这是PHP中的一个严重问题。
有趣的是,包含就像将其他文件中的内容复制/粘贴到代码中一样。但它只会在代码中运行时才会发生。这意味着它们可以是动态的并且基于正在运行的代码。但这也意味着他们不能事先进行预处理和联系。
答案 3 :(得分:0)
我发现首先定义我的函数并稍后调用它们是一个好习惯,但是只要它们在那里就放在哪里并不重要;)
另外,我喜欢将我的功能分成不同的php文件,具体取决于用途,只是为了组织起来:)
答案 4 :(得分:-1)
无论您在何处定义功能以及呼叫的位置。因为据我所知,PHP服务器应用程序首先读取整个页面然后执行它。