2013-07-14 18 views
0

也许我只是累了,或只是简单地感到困惑,但我有一个奇怪的问题处理一些require_once()电话和ob_start()变量的可访问与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 

的config.php

$A = 'bar'; 

function foo(){ 
    return "FOO"; 
} 

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

+0

向我们显示config.php –

+1

是否有函数涉及(在main.php或some_file.php中)您没有向我们展示? – jcsanyi

+2

你在哪里使用显然没有设置的$ A?请向我们展示更完整的[SSCCE](http://sscce.org/)。 –

回答

1

documentation说:

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

+0

不知道我错过了这一点,谢谢 – anson

2

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


话虽这么说,要记住的事情是什么样子包含文件中的全局变量实际上是在调用它的功能范围结束。因此,如果在第一时间require_once()被称为是从功能,$A变量的作用域功能 - 当函数返回时,就像任何其他变量的函数中定义消失。

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