13

require_once()が関数内で使用されている場合に、スコープをグローバル スコープに設定する方法を探していrequire_once()ます。次のコードのようなものが機能するはずです。

ファイル `foo.php':

<?php

$foo = 42;

実際のコード:

<?php

function includeFooFile() {
    require_once("foo.php"); // scope of "foo.php" will be the function scope
}

$foo = 23;

includeFooFile();
echo($foo."\n"); // will print 23, but I want it to print 42.

のスコープを明示的に設定する方法はありrequire_once()ますか? 良い回避策はありますか?

4

7 に答える 7

5

変数を「グローバル化」する以外に、これを行う方法はありません。

global $foo;
$foo = 42;

また

$GLOBALS['foo'] = 42;

印刷すると、値は42になるはずです。

アップデート

クラスまたは関数の組み込みに関しては、クラス メソッドについて話している場合を除き、すべての関数とクラスは常にグローバルと見なされることに注意してください。その時点で、クラス内のメソッドはクラス定義自体からのみ使用でき、グローバル関数としては使用できません。

于 2012-01-23T15:07:51.860 に答える
3

これは間違いなく「良い」回避策ではありませんが、うまくいくでしょう:

function includeFooFile() {
  require_once("foo.php");
  foreach (get_defined_vars() as $key => $value) {
    // Ignore superglobals
    if (!in_array($key, array('GLOBALS','_SERVER','_GET','_POST','_FILES','_COOKIE','_SESSION','_REQUEST','_ENV'))) {
      $GLOBALS[$key] = $value;
    }
  }
}

ただし、クラスまたは関数をネストできないため、解析エラーが発生するため、インクルードされたファイルは関数またはクラス (および現在考えられない他のものも) を定義できません。

編集ファイルに関数を含めることができるようです。できないとずっと思っていましたが、テストしたらできるようになりました。

于 2012-01-23T15:15:53.303 に答える
3

で global を宣言する必要がありますfoo.php

<?php
 global $foo;
 $foo = 42;
?>

そうでなければ、おそらく不可能です。

extract()get_defined_vars()globalおよび$GLOBALSさまざまな組み合わせで試してみることができます...たとえば、定義されたすべての変数を繰り返し処理し、ファイルを要求する前にグローバルを呼び出します...

$vars = get_defined_vars();
foreach($vars as $varname => $value)
{
  global $$varname; //$$ is no mistake here
}
require...

でも、行きたい場所に行けるか不安…

于 2012-01-23T15:11:34.370 に答える
2

スコープは使用する場所などで明示的に定義されているためrequire、関数のスコープ内の変数をどうするかを指定する必要があります。

function includeFooFile() {
    require_once("foo.php"); // scope of "foo.php" will be the function scope

    foreach (get_defined_vars() as $k => $v)
    {
        $GLOBALS[$k] = &$v;
    }
}

この例では、探している可能性のある変数と参照の両方を処理します。デモrequire_once一度しか機能せず、変数を一度しか定義しないことに注意してください。

于 2012-01-23T15:15:06.177 に答える
1

私はそれを試していません(グローバル変数を使用することは悪い考えですので)が、これは潜在的に機能する可能性があります:

require_once '...';
$GLOBALS = array_merge($GLOBALS, get_defined_vars());

または、手動で行うこともできます。

foreach (get_defined_vars() as $k => $v) {
    $GLOBALS[$k] = $v;
}
于 2012-01-23T15:17:57.173 に答える
1

正確な要件に応じて、定数を使用できます。グローバルスコープでファイルを必要としますが、その中に定数を設定します。

IE ファイル.php:

define('MY_CONSTANT', 42);

次に、スクリプトのどこでもMY_CONSTANT値を参照するために使用しますが、一度設定すると編集できなくなります。それ以外は、他の回答が言うように変数をグローバル化できますが、含まれているファイルから値を取得する以外に何を達成しようとしているのかは 100% 明確ではありませんか? その場合、定数は問題ありません。

更新: オブジェクトのプロパティをどこでも使用できるようにすることを説明したので、静的クラスの作成を検討することをお勧めします。これは、グローバル スコープでインスタンス化されると、アプリのどこでも使用できます。リンクされたマニュアルページを読んでください。必要最小限の例があります。

于 2012-01-23T15:07:56.130 に答える