2013-03-04 88 views
2

我遇到了一些遺留代碼的問題,我嘗試將其添加到Yii項目中。php函數全局定義變量不適用於Yii

它與全局變量有關,我很清楚應該將其作爲參數傳遞,但是由於這些舊代碼在其他項目中用於重寫它並不是真正的選項。

$testVar = '123'; 
function testOutput() { 
    global $testVar; 
    var_dump($testVar); 
} 
testOutput(); 

現在,如果我有一個簡單的PHP文件它的工作原理文件和輸出

string '123' (length=3) 

但是,如果我有一個的Yii控制器,甚至在模板它輸出這個

這個文件
null 

我試圖搜索這個問題,但我只是得到了一堆有關使用全局變量的結果不正確。我確定它實際上並不是Yii問題,但很可能是Yii設置的php_ini設置,但在搜索代碼或Yii文檔時我找不到任何可以解釋這一點的文檔。

這個例子可以通過用我的第一個代碼塊創建一個文件來測試,然後將它包含到Yii模板或控制器中。我甚至用一個乾淨的例子Yii項目來測試它。

我希望我沒有因爲我覺得這不僅僅是一個Yii特定問題而通過在Yii上標記這個問題來解決這個問題的可能性。

任何見解將不勝感激。

+5

測試如果你宣佈'$的testvar = 123'函數/類裏面,它不是全球性的。 – DCoder 2013-03-04 19:42:11

+1

如果你做'global $ testVar; $ testVar = 123;'在開始函數定義之前,它會起作用,我剛剛用Yii控制器進行了測試 – 2013-03-04 19:55:18

+0

@MarkoD你是對的,但爲什麼呢?任何文檔都可以說明爲什麼需要這樣做,以及Yii框架爲什麼需要這樣做?你也把這個作爲答案,我會接受它。 – byoungb 2013-03-04 20:17:24

回答

5

如果你喜歡這款,它會工作,我只是用的Yii控制器

global $testVar; 
$testVar = '123'; 
function testOutput() { 
    global $testVar; 
    var_dump($testVar); 
} 
testOutput(); 
+0

謝謝!有同樣的問題。這是爲什麼發生?你有好主意嗎? – MeV 2016-04-08 15:19:05

2

正如DCoder提到的,如果您選擇將它們聲明一個類,函數/法裏那麼他們是不是全球性的。你可以嘗試一下,雖然分配到$ _GLOBALS陣列:

$GLOBALS['testVar'] = 123; 

但是根據遺留代碼和你將如何整合它,你可能需要改變舊代碼的所有引用使用$GLOBALS['thevar'],而不是$thevar或做一個extract($GLOBALS)位於部分或全部舊版文件的頂部。

+0

當前代碼主要爲全局變量使用由幾個不同的函數和類使用的memcached連接對象和mysqli連接對象。 – byoungb 2013-03-04 20:09:02