2012-02-09 76 views
0

我有一個使用大量全局變量和數組的函數 - 例如,在PHP中使用全局變量的方式在Javascript中使用的方式

$a=1; 
$b[0]='a'; 
$b[1]='b'; 
$c='Hello'; 

function foo() { 
echo "$a 
     $b[0] 
     $b[1] 
     $c"; 
} 

我明白,而不是JS,你必須包括增值經銷商,當你調用該函數:

function foo($a,$b,$c) 

但因爲我使用許多不同的VAR和陣列的功能,並且由於大部分變量的主要來源是$ _GET數組(在使用extract($ _ GET)之後),我不確定如何執行此操作。

有沒有辦法讓PHP函數的行爲像這樣的JS函數?

+6

簡單的解決方案,不要在PHP或JavaScript中使用全局變量。 – zzzzBov 2012-02-09 17:08:14

+0

你不想這樣做。看到http://stackoverflow.com/questions/5166087/php-global-in-functions/5166527#5166527 – Gordon 2012-02-09 17:10:44

+0

每當我看到'全球'被使用時,我會畏縮。 – MetalFrog 2012-02-09 17:14:40

回答

1

您可以使用全局關鍵字:

$a = "Hello World"; 
$b = "Hello World"; 

function outputStrings(){ 
    global $a, $b; 
    echo $a." - ".$b; 
} 

$b = "Goodbye World"; 

outputStrings(); // ouputs "Hello World - Goodbye World" 

然而,它最好不要使用這種結構。它通常令人困惑,並會使您的代碼難以維護。 Wordpress在他們的代碼庫中使用了這種方法,這使得非常棘手的調試成爲可能。其他插件和代碼可以插入和修改全局變量,更改腳本的輸出。

會是什麼更好的將是兩種:

使用一個面向對象的結構,爲您的Web應用程序。

這樣你就可以使用對象而不是隨機的全局變量。這解決了在腳本過程中意外覆蓋全局變量的問題。它還有助於正確組織變量,因此有關用戶的所有變量都可以在User類中。像這樣構建它更有意義。

class User { 
    private $firstName; 
    private $secondName; 
    private $gender; 

    public function __construct($fname, $sname, $gend){ 
    $this->firstName = $fname; 
    $this->secondName = $sname; 
    $this->gender = $gend; 
    } 

    public function outputDetails(){ 
    echo $this->firstName." ".$this->secondName." is ".$this->gender; 
    } 
} 

$user = new User("Thomas", "Clayson", "Male"); 
$user->outputDetails(); 

變量傳遞到就像你在你的例子已經證明功能

。這是這樣做的普遍接受的標準方式。你應該總是像這樣傳遞變量,它可以幫助你定義範圍和適當的結構。它也意味着你知道變量的價值是什麼,因爲你擁有它們並將它們傳遞給函數,而不僅僅是從全局範圍中抽取變量。

2

您應該使用「全局」關鍵字,它告訴編譯器查找全局變量。

function foo() { 
    **global $a, $b, $c;** 
echo "$a 
     $b[0] 
     $b[1] 
     $c"; 
} 
+2

「應該」是一個有趣的詞。 – MetalFrog 2012-02-09 17:12:14

+3

你*可以*,但你絕對*不應該* – Gordon 2012-02-09 17:12:58

0

您可以訪問全局變量與global關鍵字:

global $a=1; 
global $b[0]='a'; 
global $b[1]='b'; 
global $c='Hello'; 

function foo() { 
    global $a, $b, $c; 
    echo "$a 
    $b[0] 
    $b[1] 
    $c"; 
} 

否則,您可以使用預定義$GLOBALS陣列:

function foo() { 
echo "$GLOBALS['a'] 
$GLOBALS['b'][0] 
$GLOBALS['b'][1] 
$GLOBALS[c]"; 
} 

在這裏,你有更多的信息:

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

0

當你有時有一個函數,PHP 5.3中的上下文管理不允許在不使用「全局」關鍵字的情況下訪問全局變量。

Php.net有一個關於主題here的文章。

function foo() { 
    global $a, $b, $c; 
    echo "$a 
    $b[0] 
    $b[1] 
    $c"; 
} 
1

由於在PHP中,您不必在使用變量前聲明變量,下面的代碼對於函數所指的變量是不明確的。

$a = 'ten'; 
function foo($a) { 
    echo($a); 
} 

foo(10); // Outputs: 10 

PHP通過假設在一個函數範圍內的所有變量是局部的,除非它們在函數聲明使用global關鍵字來從全球範圍內消除歧義。

$a = 10; 
function foo($b) { 
    global $a; 
    echo($a); 
} 

foo('ten'); // Outputs: 10 

一般使用全局變量是不鼓勵,因爲它引入了你的對象之間的緊密耦合,降低了可讀性和代碼的地方,污染了全局命名空間,並增加了不必記住如何開發者的心理負荷許多/他們有什麼全局變量。

相關問題