2012-11-23 8 views
117

私はこのようなコードに何か持っている:PHPでグローバル変数を宣言するには?

<? 
    $a="localhost"; 
    function body(){ 
     global $a; 
     echo $a; 
    } 

    function head(){ 
     global $a; 
     echo $a; 
    } 

    function footer(){ 
     global $a; 
     echo $a; 
    } 
?> 

は一つの場所にグローバル変数を定義し、一度にすべての関数内の変数$aにアクセスできるようにする方法はありますか? global $a;をもっと利用しないでください。

+11

がNo存在しない機能外部からアクセスすることができます。 'global'キーワードが気に入らない場合は、すべてのスコープで' $ GLOBALS ['a'] 'スーパーグローバルを使うか、関数にパラメータを渡すことを検討してください。 –

+3

重要なことがあれば、セッションvarでも使用できます。 –

答えて

183

スクリプト全体ible

現在で定義されているすべての変数への参照を含む連想配列スクリプトのグローバルスコープ変数名は配列のキーです。


あなたには、いくつかの共通の変数を必要とする関数のセットを持っている場合は、プロパティを持つクラスではなく、グローバルの良い選択かもしれない:

class MyTest 
{ 
    protected $a; 

    public function __construct($a) 
    { 
     $this->a = $a; 
    } 

    public function head() 
    { 
     echo $this->a; 
    } 

    public function footer() 
    { 
     echo $this->a; 
    } 
} 

$a = 'localhost'; 
$obj = new MyTest($a); 
+6

+10。これは完全に機能します。 –

+4

+2これは、厄介なグローバル構文を処理する代わりに、クラスでラップするためのものです。 –

+0

+100私のために働いた –

4

あなたはあなたが質問を書いた方法でこれを答えました - 「定義」を使用してください。一度設定すると、定義を変更することはできません。

また、使用できるclass :: constantのような、クラス内に定数を持つトリックがあります。クラスに静的プロパティを宣言することで変数を変更することもできます。静的プロパティを変更する場合は、静的プロパティを設定する関数を使用します。

57

変数を使用すると、define

例使用することができます変更するつもりされていない場合は、次の$ GLOBALSに

$GLOBALS['variable'] = 'localhost'; 

のようなスーパーグローバル配列を、あなたの変数を追加し、グローバルに使用

define('FOOTER_CONTENT', 'Hello I\'m an awesome footer!'); 

function footer() 
{ 
    echo FOOTER_CONTENT; 
} 
+0

'FOOTER_CONTENT'が変更しようとするとどうなりますか? Javaでは 'final'、C、C++、Cでは' const'と同じですか? – Lion

+2

FOOTER_CONTENTをもう一度定義しようとすると、phpはその旨を通知します – Dale

+0

ページが読み込まれるたびに現在のunixエポック時間を計算し、その値を2つの計算(関数)で使用する必要がありました。 "定義する"私のために働いた。当初は、私は "echo FOOTER_CONTENT;"先行する '$'がなく、エラーが発生しました。 – user208145

23

またはアクセスできる定数を使用できますManualから

$GLOBALS['a'] = 'localhost'; 

function body(){ 

    echo $GLOBALS['a']; 
} 

$GLOBALS配列を代わりに使用することができ

define('HOSTNAME', 'localhost'); 
+0

'define'を使用すると、一度設定すると、定義を変更することはできません!あなたの最初の例では –

+0

が、今度は '$変数はスクリプトの後半で' localhost 'と呼ばれています。 – HollerTrain

+0

いいえこの変数を使用する場合は、$ GLOBALS ['variable']のように使用する必要があります。 –

-16

あなたはグローバルを使用するべきではありませんもはや、PHP 5.4では利用できません。

+13

REGISTER GLOBALSが削除されました。グローバルではありません。 – unity100

+4

この回答は書かれているとおり、間違っており、unity100のコメントを反映するように更新する必要があります。 GLOBALSがまだ利用可能な場合は、GLOBALのどの部分が変更されたかを明確にしてください。 [これのようなもの](http://stackoverflow.com/questions/10158140/php-5-4-0-register-globals-deprecated#answer-10158165) – crashwap

+0

http://php.net/manual/ja/ security.globals.php – m13r

5

この回答は非常に遅いですが、私はブーリアン、配列、および整数初期値をグローバルスコープ静的変数として保持するクラスを設定しています。任意の定数ストリングはそのように定義されます。

define("myconstant", "value"); 

class globalVars { 

    static $a = false; 

    static $b = 0; 

    static $c = array('first' => 2, 'second' => 5); 

} 


function test($num) { 

    if (!globalVars::$a) { 

     $returnVal = 'The ' . myconstant . ' of ' . $num . ' plus ' . globalVars::$b . ' plus ' . globalVars::$c['second'] . ' is ' . ($num + globalVars::$b + globalVars::$c['second']) . '.'; 

     globalVars::$a = true; 

    } else { 

     $returnVal = 'I forgot'; 

    } 

    return $returnVal; 

} 

echo test(9); ---> The value of 9 + 0 + 5 is 14. 

echo "<br>"; 

echo globalVars::$a; ----> 1 

staticキーワードは、$ bの$ VARS、および$ cは、グローバルスコープされることはありません、他のクラスに存在する必要があります。

4

これはしかし、あなたの意思... PHP 7.0に適合している場合は、閉鎖機能やラムダにキーワードuseを試すことができます。それは良いことではなく、ただの選択肢です。

$foo = "New"; 
$closure = (function($bar) use ($foo) { 
    echo "$foo $bar"; 
})("York"); 

demo |関数外で宣言

info
1

変数は、グローバルスコープを有するのみ

<?php 
global $a; 
$a=10; 
echo $a; 
function xl($a){ 
echo "in the function".$a." <br/>"; 
} 
echo "in outside ".$a."<br/>"; 
xl($a); 
?> 
関連する問題