2012-06-23 41 views
-1

我相對較新的PHP,我遇到了一個非常奇怪的問題。 讓我給在上面的例子中一個非常簡單的代碼php函數不再識別在其外部定義的變量

$test = 'test'; 

function test(){ 
    echo $test; 
} 

test(); 

一個例子,它使用的工作只是完全正常,返回「測試」作爲調用測試()函數的結果。然而,就在今天它開始返回錯誤,說變量$ test是未定義的。我100%確定它以前工作得很好。這是一些更新在PHP?或者我在這裏做錯了什麼?我正在使用wamp並在我的本地主機上進行測試。謝謝!

回答

3

這是正常現象,這就是所謂的「可變範圍」

閱讀:http://php.net/manual/en/language.variables.scope.php

其中一個「陷阱」的是:

您可能會注意到,這是一點點與C語言 不同之處在於C中的全局變量可自動用於功能 ,除非被本地定義明確覆蓋。這可能會導致一些問題,因爲人們可能會無意中更改全局變量 變量。在PHP中,全局變量必須在 函數中聲明爲全局變量,如果它們將用於該函數。

+0

這對我來說是全新的。我一直在關注一個登錄/註冊PHP教程,這使我創建了10個其他函數,用於調用全局變量就好了,沒有在函數中聲明全局變量。但它突然停止工作。你知道這是爲什麼嗎? –

+0

不,不是,因爲你可以在我給你的鏈接中閱讀,這是預期的行爲,所以無論發生什麼似乎都很奇怪。 – Nanne

+0

是否因爲安全性,我不應該使用全局? –

2

這是因爲它超出了功能範圍。要訪問變量定義的外部函數,您必須使用全局關鍵字。

$test = 'test'; 

function test(){ 
    global $test 
    echo $test; 
} 

test(); 

請仔細閱讀有關PHP手冊的鏈接這裏的變量範圍:http://php.net/manual/en/language.variables.scope.php

+0

請勿使用全局變量,將其作爲參數傳遞給函數。 –

+0

@Truth只是一個選擇,在這裏我們沒有談論什麼是好的,什麼是壞的。全局只是訪問它的另一種方式,當它在那裏時,您可以始終使用它,儘管參數將是更好的選擇。 – Dharmavir

+0

你在說什麼就像「有人問如何從數據庫中檢索數據,所以讓我們用'mysql_ *'函數來回答,這只是另一種方式」**否**這不是另一種方式,它是一個**不好的* *方式,我不希望一個新的程序員學習。 –

1

在函數內部,你需要的功能測試中聲明global $test;爲變量測試具有意義。此外,在大括號{}內聲明的任何變量在離開大括號的範圍時將不會被設置,而不僅僅在函數內。

+0

請參閱我對Dharmavir的回答的評論。 –

+0

不要這麼嚴格的人。他沒有提到要使用什麼,也沒有提及。 –

+0

是的,@真理的苛刻是不必要的,但有些人認爲他們的真理是「路」,對別人沒有尊重或擔心。上次我使用全局時,我完全重寫了腳本和使用的類。然後,該項目的概念被放棄了。這是對的,但也浪費時間和精力。 –