2012-02-09 8 views
0

私はたくさんのグローバル変数と配列を使用する関数を持っています。PHPでの関数内でグローバル変数を使用する方法は、JavaScriptで行う方法

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

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

私はJSとは反対に、あなたは関数を呼び出すときVARSを含める必要があることを理解:私は関数内で異なる変数や配列の多くを使用していているので、

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

が、ほとんどの変数の主な起源は$ _GET配列(extract($ _ GET)の使用後)なので、これをどうやって行うのかは分かりません。

PHP関数をそのようにJS関数のように動作させる方法はありますか?

+6

簡単な解決方法は、PHPまたはJavaScriptでグローバル変数を使用しないでください。 – zzzzBov

+0

あなたはそれをしたくありません。 http://stackoverflow.com/questions/5166087/php-global-in-functions/5166527#5166527 – Gordon

+0

「グローバル」が使用されるたびに私はうんざりします。 – MetalFrog

答えて

1

あなたがグローバルなキーワードを使用することができます。一般的には混乱し、コードを維持するのが難しくなります。 Wordpressはこのアプローチをコードベースで多く使用しており、非常にトリッキーなデバッグが可能です。他のプラグインとコードは、グローバル変数を挿入して変更し、スクリプトの出力を変更することができます。

は、あなたのWebアプリケーションのためのOOPの構造を使用します。どちらかになります良いだろう何

このように、ランダムなグローバル変数の代わりにオブジェクトを使用することができます。これは、あなたが間違ってスクリプトの中でグローバル変数を上書きするという問題を回避します。また、変数を正しく整理するのに役立ちます。したがって、ユーザーに関するすべての変数は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

グローバル変数を探すようにコンパイラに指示する "global"キーワードを使用する必要があります。この構造体を使用しない、しかし、その最高を

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

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

$b = "Goodbye World"; 

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

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

"should"は面白い言葉です。 – MetalFrog

+3

あなたは*できますが、間違いなくあなたは* – Gordon

0

あなたはglobalキーワードでグローバルVARSにアクセスすることができます。

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配列を使用することができます。

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

0

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

あなたはより多くの情報を持っていますいつまでもあなたPHP 5.3のコンテキスト管理では、 "global"キーワードを使用せずにグローバル変数へのアクセスを許可していません。

Php.netには、トピックhereに関する投稿があります。

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

変数を使用する前に宣言する必要がないため、次のコードは、その関数がどの変数を参照しているか不明です。

$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 

は、コードの読みやすさと局所性を低下させる、グローバルな名前空間を汚染し、どのように覚えてい開発者に精神的負荷を増大させ多くの/どのようなグローバル変数を持っています。

関連する問題