質問

状況:

インデックス.php:

<?php
    include("foo.php");
    include("baz.php");
        foo("bar.php");
?>

baz.php:

<?php
    $x = 42;
?>

foo.php:

<?php
    function foo($p) {
        include_once($p); // please dont mind the inclusion hole
    }
?>

bar.php:

<?php
    echo $x;
?>

ゼンド 知らせ:未定義の変数:バツ

グローバル $x を配置します。bar.php では通知が削除されますが、そもそもなぜこれに関する通知があるのか​​理解できます。C ヘッダーを含めるなどの作業はほとんど含まれていませんか?つまり、解釈されたコードは次のようになります。

<?php
    function foo($p) {
        include_once($p); // please dont mind the inclusion hole
    }
    $x = 42;

    // this however, is included by a function...
    // does the function's scope influence the stuff it includes?
    echo $x; // undefined variable
?>

私のエディタは Eclipse/Zend パッケージです。

役に立ちましたか?

解決

私は専門家ではないので、間違っていても怒らないでください。しかし、include_once または require_once によって呼び出されるファイルは呼び出し元のコンテキストで呼び出されると思います。関数 foo() は $x について知らないため、呼び出されたインクルードも知りません。上記と同じ設定で関数 foo() 内で $x を「宣言」することで実験できます。

他のヒント

私はほとんどの場合、何も定義せずに "$o .= 'foo'" を使用するため、このような通知をたくさん受け取ります。error_reporting(E_ALL ^ E_NOTICE) で非表示にしているだけですが、この場合それが最適な方法かどうかはわかりません。

変数と関数が同じファイル内にある場合でも機能しません。

  1 <?php
  2
  3 $x = 3;
  4
  5 function t()
  6 {
  7   echo $x;
  8 }
  9
 10 t();

何も印刷しません。

ただし、グローバルを追加します

  1 <?php
  2
  3 $x = 3;
  4
  5 function t()
  6 {
  7   global $x;
  8   echo $x;
  9 }
 10
 11 t();

「3」が表示されます。

関数では、宣言しない限りグローバル変数を確認できません。

はい、それが問題の原因となっている関数スコープです

交換するなら

foo("bar.php");

include("bar.php");

関数スコープではなく現在のスコープに配置されているため、すべてが正常に動作していることがわかります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top