4

編集できないファイルがある場合。a.php

<?php
$a = 1;
function a() {
  global $a;
  echo $a;
}  
a();

その後、php a.php印刷を1うまく実行します。しかし、私が持っている場合b.php

<?php
function b() {
  include "a.php";
}
b();

その後、実行php b.phpしても何も印刷されません。

include "a.php"編集せずに同じように動作させるには、 の前に何を入力できa.phpますか?

(明らかに を定義する以外に$a。私の実世界の例では、複雑な に対して機能する必要がありますa.php)。

4

3 に答える 3

3

新しい関数にグローバルを追加してみてください。

function b() {
  global $a;

  include "a.php";
}

現時点では、PHP が関数$aに対してローカルとして扱っているのだろうかと思いb()ます。

補遺: あなたのコメントに応えて、インクルードが関数内でローカルに作成した任意の変数を取得し、それらをグローバルとして作り直す必要があるようです。これは、OSX 10.6.8 の 5.3.20 で機能します。

function b() {
    include 'a.php';

    // Move variables into global space
    foreach (get_defined_vars() as $name => $value) {
        global $$name;
        // global wipes the value, so just reset it
        $$name = $value;
        echo "Declared $name as global\n";
    }
}

b();
// Your global vars should be available here

echo明らかに、それが機能することに満足したら、削除できます。

于 2013-02-03T11:05:39.700 に答える
2

関数内で関数を定義しますか? うん。しかし、他の方法が許されない現実の状況があると思います。しかし、記録のために、これは本当に悪い習慣です

に追加global $aするb()とうまくいくはずです。

function b() {
  global $a;
  include "a.php";
}

どの変数を定義する必要があるかわかりません。a.php は本当に複雑です

次に、私が考えることができる唯一の方法は、b.php で関数を使用しないことです。そのため、a.php を含めるとグローバル スコープになります。他に方法がありません。

于 2013-02-03T11:05:31.120 に答える
1

a.php独自のアプリケーションにラップする必要があるレガシーまたはサードパーティのスクリプトのようです。私はかつて同様の問題を抱えていましたが、解決策はきれいではありませんでした。まず、どのグローバル変数が存在するか (または類似のヘルプ)を見つける必要があります。grep global

これは、「スクリプト アダプター」クラスの関連部分です。

private function _includeScript($file, $globals)
{
    foreach ($globals as $global) {
        global $$global;
    }

    ob_start();
    require $file;
    $this->_response->setBody(ob_get_clean());
}

ご覧のとおり、出力もキャッチする必要がありました。このクラスは、すべてをオブジェクトに割り当てるための呼び出しもエミュレート$_GETしてキャッチしますが、あなたの場合、このメソッドのみが重要です。これは、ファイル名とグローバル変数名の配列をパラメータとして呼び出されます。headerResponse

_includeScript('a.php', array('a'));
于 2013-02-03T11:24:13.193 に答える