2013-03-28 14 views
43

ほとんどのプログラミング言語のスコープルールによると、関数の外側で定義された変数にアクセスできますが、なぜこのコードが機能しないのですか?関数内のPHPアクセスグローバル変数

<?php 
$data='My data'; 
function menugen(){ 

    echo "[".$data."]"; 
} 
menugen(); 
?> 

出力で[]があります。

+3

マニュアルは、このようなことを言うん引数 –

+1

としての機能に渡し、グローバルとして扱いしないでください? – deceze

+0

関連する読者:[関数内のPHPグローバル](http://stackoverflow.com/q/5166087/1409082) – Jocelyn

答えて

83

あなたがアクセスすることがありますどのグローバル変数を宣言するを持っているので、それが機能していません。

$data='My data'; 
function menugen(){ 
    global $data; // <-- add this line 
    echo "[".$data."]"; 
} 
menugen(); 

そうでない場合は、あなたを$GLOBALS['data']としてアクセスできます。http://php.net/manual/en/language.variables.scope.php

少しでもお使いになることをお勧めしますグローバルではなく、パラメータとして渡すことをお勧めします。

+0

ありがとうございます、あなたは正しいですが、マニュアルの2番目の例ではこの行を使用しませんでした:http://php.net/manual/en/language.variables.scope.php –

+3

実際には、読者は何をしないのですか? 'echoステートメントが$ a変数のローカルバージョンを参照し、このスコープ内に値が割り当てられていないため、このスクリプトは出力を生成しません。 ' –

+1

Dang!私はこの答えをupvoteにログインしなければならなかったのは、PHP変数のスコープを忘れてしまったからです。 –

0

あなたが関数に変数を渡す必要があります:

$data = 'My data'; 

function menugen($data) 
{ 
    echo $data; 
} 
6

これは範囲の問題です。要するに、グローバル変数はSO避けるべきである。

あなたのいずれかをパラメータとして渡す必要があります。

$data = 'My data'; 

function menugen($data) 
{ 
    echo $data; 
} 

やクラスでそれを持っていると

class MyClass 
{ 
    private $data = ""; 

    function menugen() 
    { 
     echo this->data; 
    } 

} 

それにアクセス編集:参照してください。 @MatteoTassinariの答えと同様に、それをグローバルにアクセスするためにマークすることができますが、グローバル変数は一般的には必要ではありませんので、コーディングを再考することが賢明でしょう。

+0

と別の方法は、キーワード**グローバル**を使用することです(これは、最良の方法ではありません)。 – Jocelyn

+0

ええ、Matteoの投稿に言及するだけで編集しました。 – webnoob

+0

"すべきか"は質問に答えず、これはすべての場合に最適な方法ではないかもしれません。簡単なスクリプトでは、パラメータを変更したりクラスを追加するのは難しいです。 JavaScriptによく似ていますが、PHPではすべてがオブジェクト指向である必要はなく、名前空間はwazooになります。 – Beejor

7

次のいずれかを行うことができます

<?php 
$data='My data'; 
function menugen(){ 
    global $data; 
    echo "[".$data."]"; 
} 
menugen(); 

それとも

言われていること
<?php 
$data='My data'; 
function menugen(){ 
    echo "[".$GLOBALS['data']."]"; 
} 
menugen(); 

は、グローバルの乱用は、いくつかの貧しい人々のコードにつながることができます。通常、必要なものを渡す方が良いです。たとえば、グローバルデータベースオブジェクトを参照する代わりに、データベースへのハンドルを渡し、それに基づいて処理する必要があります。これはDependency Injectionと呼ばれます。自動テストを実装すると、あなたの人生がずっと楽になります。それを行うには

3

別の方法:

<?php 

$data = 'My data'; 

$menugen = function() use ($data) { 

    echo "[".$data."]"; 
}; 

$menugen(); 
-1

あなたが「定義」機能を使用することができますが、この関数は一度定義を変更することはできません定数を作成したい場合。

<?php 
define("GREETING", "Welcome to W3Schools.com!"); 

function myTest() { 
    echo GREETING; 
} 

myTest(); 
?> 

http://www.w3schools.com/php/php_constants.asp

+0

これは変数ではなくグローバル定数を定義します。 – Beejor

+0

違いは何ですか? それには何でも保存できます –

+2

一度定​​義した定数は変更できません。 – Beejor