27

PHPのグローバル変数に問題があります。あるファイルにvarセットがあり、さらに別のファイルで定義され$screenたファイルを呼び出す別のファイルが必要です。宣言してからinitSession()、最初のスクリプトで設定された値を使用して$screenをさらに下に処理します。initSession()global $screen

これはどのように可能ですか?

さらに混乱させるために、$ screenを再度設定してからを呼び出すと、initSession()最初に使用された値が再度使用されます。次のコードはプロセスを説明します。誰かがこれを説明することに挑戦することができますか?

$screen = "list1.inc";            // From model.php
require "controller.php";         // From model.php
initSession();                    // From controller.php
global $screen;                   // From Include.Session.inc  
echo $screen; // prints "list1.inc" // From anywhere
$screen = "delete1.inc";          // From model2.php
require "controller2.php"         
initSession();
global $screen;
echo $screen; // prints "list1.inc" 

更新:2番目のモデルが必要になる直前にグローバルを再度
宣言すると、$screenがメソッドに対して適切に更新されます。変。$screeninitSession()

4

7 に答える 7

62

Global変数をグローバルにしません。私はそれがトリッキーであることを知っています:-)

Globalローカル変数は、より高いスコープを持つ変数であるかのように使用されることを示しています。

EG:

<?php

$var = "test"; // this is accessible in all the rest of the code, even an included one

function foo2()
{
    global $var;
    echo $var; // this print "test"
    $var = 'test2';
}

global $var; // this is totally useless, unless this file is included inside a class or function

function foo()
{
    echo $var; // this print nothing, you are using a local var
    $var = 'test3';
}

foo();
foo2();
echo $var;  // this will print 'test2'
?>

グローバル変数が良いアイデアになることはめったにないことに注意してください。それらなしで99.99999%の時間コーディングでき、ファジースコープがない場合はコードの保守がはるかに簡単になります。globalできれば避けてください。

于 2008-09-20T09:48:01.907 に答える
16

global $foo「この変数をグローバルにして、誰もが使用できるようにする」という意味ではありません。「この関数の範囲内で、グローバル変数を使用global $fooする」を意味します。$foo

あなたの例から、毎回、関数内から$screenを参照していると仮定しています。その場合はglobal $screen、各関数で使用する必要があります。

于 2008-09-20T09:48:58.410 に答える
5

各ファイルの先頭だけでなく、それを参照するすべての関数に「グローバル$screen」を配置する必要があります。

于 2008-09-20T09:15:00.440 に答える
4

多くの関数を使用するタスク中にアクセスしたい変数がたくさんある場合は、「コンテキスト」オブジェクトを作成してそれらを保持することを検討してください。

//We're doing "foo", and we need importantString and relevantObject to do it
$fooContext = new StdClass(); //StdClass is an empty class
$fooContext->importantString = "a very important string";
$fooContext->relevantObject = new RelevantObject();

doFoo($fooContext);

次に、このオブジェクトをパラメータとしてすべての関数に渡します。グローバル変数は必要なく、関数のシグネチャはクリーンなままです。空のStdClassを、実際に関連するメソッドを含むクラスに後で簡単に置き換えることもできます。

于 2008-09-20T10:17:31.600 に答える
1

グローバルスコープは、含まれているファイルと必要なファイルにまたがっています。関数内から変数を使用しない限り、globalキーワードを使用する必要はありません。代わりに$GLOBALS配列を使用してみてください。

于 2008-09-20T09:23:11.607 に答える
1

変数の値を定義する前に、変数をグローバルとして宣言する必要があります。

于 2012-07-01T18:19:58.113 に答える
0

関数またはクラスに含まれるまでは役に立ちません。グローバルとは、プログラムのどの部分でも変数を使用できることを意味します。したがって、グローバルが関数またはクラスに含まれていない場合、Global を使用しても意味がありません。

于 2014-05-29T06:05:27.377 に答える