1

也许我只是累了,或者只是感到困惑,但我在处理一些require_once()电话时遇到了一个奇怪的问题ob_start()

基本结构:

Main.php 的顶部:

require_once 'config.php'; // includes variable $A = "bar", and Function "foo"

function getPage(){
  ob_start();
  include 'some_file.php';
  $html = ob_get_clean();
  echo $html;
  die();
}
getPage();

some_file.php

require_once 'config.php'; // includes same config file
var_dump($A); // NULL
foo(); // runs, returns correct value

配置文件

$A = 'bar';

function foo(){
  return "FOO";
}

那么,这里有什么问题?我在缓冲输出时包含一个文件。所需的文件config.php包含一个变量和函数。在缓冲区期间包含some_file.php时,该变量$A显然是不可设置/可访问的。函数可以foo执行。

4

2 回答 2

2

文档说:

当一个文件被包含时,它包含的代码继承了包含发生的行的变量范围。从那时起,调用文件中该行的任何可用变量都将在被调用文件中可用。但是,包含文件中定义的所有函数和类都具有全局范围。

于 2013-07-14T07:31:29.703 回答
2

您提供的代码并未说明您所描述的问题。当我按原样运行它时,它正确显示变量已定义。


话虽如此,要记住的是,包含文件中看起来像全局变量的东西实际上最终会出现在调用它的函数的范围内。因此,如果第一次require_once()调用是从函数中调用的,则$A变量的作用域是函数 - 并且在函数返回时消失,就像函数内部定义的任何其他变量一样。

如果您绝对必须在包含的文件中定义一个全局变量(您确定吗?真的吗?),请确保您仅在全局范围内包含该文件 - 而不是在函数内。如果需要从函数内访问变量,请在函数外包含文件,然后使用global关键字从函数内访问变量。

于 2013-07-14T07:32:52.713 回答