2

standalone.phpブラウザから直接、独自のスクリプトとして実行することを意図したファイルがあります。関数、クラスを定義し、他のファイルを含めます。直接呼び出すと正常に動作します。

次のようなコードが含まれています。

$DB = new Database(DB_DATABASE, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_SERVER, '', true);
function DB() { global $DB; return $DB; }

単独で実行すると、$DB はグローバル名前空間で定義され、オブジェクトを返す関数はグローバル $DB オブジェクトを取得します。繰り返しますが、これは機能します。

問題は、ブラウザーから呼び出される別のファイルがあり、sometimesInvoker.php場合によっては、standalone.php を含めて、standalone.php直接呼び出されたかのようにブラウザーに出力する必要があることです。リダイレクトは使用できず、standalone.phpURL 経由で含めることはできません。

のコードsometimesInvoker.phpは次のとおりです。

LoadPage();

function LoadPage(){
   include standalone.php;
}

したがって、階層は次のようになります。

Global name space / sometimesInvoker.php
   LoadPage() function
      standalone.php - thinks its global but it isn't
         $DB - declared intending to be global but is actually a variable inside LoadPage() function?
            function DB() - calls global DB and looks inside sometimesInvoker.php for a $DB var which isn't there, should be going up one level to LoadPage() function and grabbing that var.

それで問題が発生しましたが、どうすれば解決できますか?次のレベルアップがグローバルかどうかに関係なく、関数が 1 レベル上の変数を取得する方法が必要です。何か案は?

4

3 に答える 3

0

これは、今のところ問題を解決するために使用している回避策です。DB() 関数を次のように変更します。

function DB() {
   static $DB = null;
   if(is_null($DB))
      $DB = new Database(DB_DATABASE, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_SERVER, '', true);
   return $DB;
}

DB 関数で静的変数を使用すると、グローバル変数に依存する代わりに、クラスを 1 回インスタンス化できます。これでこの場合の問題は解決しますが、変数がグローバル名前空間ではなく親関数にある場合、関数の外部にある変数にアクセスできるかどうかを知りたいですか?

于 2013-02-13T19:10:38.553 に答える
0

次のレベルアップがグローバルかどうかに関係なく、関数が 1 レベル上の変数を取得する方法が必要です。

私があなたを正しく理解しているかどうかはわかりませんが、サブ関数で変数を使用できるようにする方法がいくつかあります。

別のスコープで変数を使用するには、「global」を使用します。

$db='whatever';
function XXYYY(){
 global $db;
 echo $db;
}

または、変数を関数に渡します。

$db='whatever';
function XXYYY($db){
 echo $db;
}

それとも私は要点を逃していますか?

于 2013-02-13T18:56:32.297 に答える
0

時々Invoker.phpで最初の行を作りますrequire_once 'standalone.php';

于 2013-02-13T18:51:31.637 に答える