- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个包含文件,它定义了一个类,然后创建了一个带有该类实例化的全局变量以及一个返回全局变量的函数(用于在其他函数中访问)。
代码方面:
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
然后你可以把你的代码分成两个文件:
include_once
可以多次调用X
类移到另一个文件中,这个新的 fille 将被 1 中添加的 include_once
包含。有了这个,即使 1. 文件被多次调用,2. 文件也只会被包含一次。
你可能应该使用 require_once
(而不是 include_once
),因为如果找不到文件,它将返回错误。
关于php - PHP 解释器进程的每一次通过是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37190604/
目前我们面临一个奇怪的问题。我们有一个大型应用程序,它作为 ROOT.war 部署在 webapp 目录中(没有其他应用程序)。 Tomcat(8.0.32)在启动时解压war。它作为 Windows
我是一名优秀的程序员,十分优秀!