【发布时间】:2020-02-20 14:02:51
【问题描述】:
如果我做这样的事情(这只是一个虚拟示例,但对解释问题很有用):
variables.php:
<?php
$foo = 'foo';
$bar = 'bar';
?>
SomeClass.php:
<?php
class SomeClass {
public static function do_something() {
// XXX Sometimes this works well; but sometimes,
// imported variables are null or empty for some
// reason within this method's scope
require_once( dirname(__FILE__) . '/variables.php' );
echo '<p>foo = '.$foo.'</p>';
echo '<p>bar = '.$bar.'</p>';
}
}
?>
两个文件都在同一个文件夹中;虽然这个类实际上在其他文件夹中的脚本中是必需的。
大多数时候它只是按预期打印:foo = foo 和 bar = bar;但是当一些执行一些繁重操作的脚本需要这个类时(在数组中填充大量变量以及其他东西,比如计算),它的行为就像导入的变量根本不存在(打印foo =和bar = )。
查看 apache 的 error.log,require_once 根本不会抛出任何错误;但它会打印如下内容:
PHP Notice: Undefined variable: foo in /path/to/class_and_variables/SomeClass.php at line 10
PHP Notice: Undefined variable: bar in /path/to/class_and_variables/SomeClass.php at line 11
通常情况下,它按预期工作,变量在do_something的范围内正确导入;但对于一些特定的脚本,它不会。
这就像(我猜)PHP 内存不足并默默地破坏了导入的变量?我不知道为什么 PHP 的 require_once 有时会表现得如此奇怪......
【问题讨论】:
-
失败时能举个例子吗
-
我只是不知道
require_once会首先查看当前文件:我以为它只是查看PATH中的可用目录。所以使用dirname(__FILE__)看起来是个好主意 -
@trey 路径不是相对于“当前文件”,它是相对于当前工作目录,它并不总是与“当前文件”相同”。使用
__FILE__使其绝对化是个好主意。 -
@deceze:实际上,我用错了词:我的意思不是“会查看当前文件”,而是“在当前目录”。对此感到抱歉
-
@trey 如果将它们都放入某个子目录并在该子目录之外执行
require 'sub/a.php'的文件,那么当前工作目录,都需要是相对的,不会是sub。
标签: php