从命令行运行时重置PHP变量


PHP variable being reset when run from command line

在文件配置中.php

$_CONFIG = array();
require_once("config.inc.php");
var_dump($_CONFIG);

在config.inc.php文件中

$_CONFIG = array('x' => 'y', ...);
var_dump($_CONFIG);

当从命令行运行时,此代码的输出为:

array(15) {
  ["x"]=>
  string(1) "y"
  ...
}
array(0) {
}

如果我删除config.php中初始化空$_config数组的第一行,脚本就会工作,并且var_dumps是相同的。

请注意,这是一个从命令行运行的脚本。知道为什么会发生这种事吗?我在两台不同的机器上尝试过,一台使用PHP 5.3.3,另一台使用PHP 5.3.5。

更新-这似乎只是命令行的问题。当从浏览器运行时,它看起来很好。此外,还有第三个文件我忘了提,它包括config.php

test.php

require_once("/path/to/config.php");

当运行test.php而不是从命令行运行config.php时,我会得到上面的输出。

您描述的情况不会产生您描述的输出。里面还有别的事;问题中没有附加代码。

来自一个非常简单的测试:

$ ls -la
-rw-rw-r--   1 jon jon    59 2012-02-28 20:37 config.inc.php
-rw-rw-r--   1 jon jon    83 2012-02-28 20:37 config.php
$ cat config.*
<?php
$_CONFIG = array('x' => 'y');
var_dump($_CONFIG);
?>
<?php
$_CONFIG = array();
require_once('config.inc.php');
var_dump($_CONFIG);
?>
$ php config.php
array(1) {
  ["x"]=>
  string(1) "y"
}
array(1) {
  ["x"]=>
  string(1) "y"
}

您看到输出的可能原因:

  • config.inc.php使用一个名称空间,定义一个不在全局名称空间中的$_config的新副本
  • require_once('config.inc.php');首先检查您的包含路径,并包含与您期望的不同的config.inc.php