gpt4 book ai didi

php - PHP 解释器进程的每一次通过是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 21:25:29 25 4
gpt4 key购买 nike

我有一个包含文件,它定义了一个类,然后创建了一个带有该类实例化的全局变量以及一个返回全局变量的函数(用于在其他函数中访问)。

代码方面:

class X {
...
}

global $x;
$x = new X();

function x() {
global $x;
return $x;
}

到目前为止一切似乎都很好。然后有一种情况(显然)这个文件被包含不止一次 - 它是由一个框架完成的,所以我不能将它限制为 include_once - 这会在尝试重新定义类时产生错误。

所以我在顶部添加了代码:

if (class_exists('X')) {
return;
}

而且我发现 $x 不再定义了。所以解释器似乎必须运行一次,找到类定义,但不处理后面的语句。然后它似乎进行了第二次传递并发现该类存在,因此它返回而没有执行类实例化。

所以我将顶部的代码更改为:

if (class_exists('X')) {
global $x;
$w = new X();

function x() {
global $x;
return $x;
}
return;
}

现在我在尝试重新声明该函数时遇到错误(原始声明仍在文件底部)。所以看起来即使没有执行实例化 X 的代码,函数也被定义了。

所以文件的顶部现在看起来像这样:

if (class_exists('X')) {
global $x;
$w = new X();

if (function_exists('x')) {
return;
}

function x() {
global $x;
return $x;
}
return;
}

现在一切正常了。

根据我所见,我最好的猜测是解释器进行一次收集类和函数定义的传递,然后进行另一次传递使用这些定义执行代码。这种解释正确吗?是否有我遗漏的细微差别?

无论如何我都不是专业的 PHP 程序员,所以任何信息都非常感谢。

最佳答案

Then there was a situation where (apparently) this file was included more than once - it's done by a framework so I can't limit it to include_once

然后你可以把你的代码分成两个文件:

  1. 在文件中添加include_once可以多次调用
  2. X 类移到另一个文件中,这个新的 fille 将被 1 中添加的 include_once 包含。

有了这个,即使 1. 文件被多次调用,2. 文件也只会被包含一次。

你可能应该使用 require_once (而不是 include_once),因为如果找不到文件,它将返回错误。

关于php - PHP 解释器进程的每一次通过是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37190604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com