2013-07-14 26 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關鍵字從函數內部訪問該變量。