2009-06-15 21 views
0

状況について不平を言いますbar.php:PHP/Zendのは、未定義の変数

<?php 
    echo $x; 
?> 

Zendの予告:未定義の変数:グローバル$ 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パッケージです。

答えて

3

私は間違っていると私には気を付けてはいけませんが、include_onceまたはrequire_onceによって呼び出されたファイルが呼び出し元のコンテキストで呼び出されたと思います。関数foo()は$ xを知らないので、呼び出されたもののどれもがインクルードします。上記と同じ設定で関数foo()の中で$ xを '宣言'することで試すことができます。

+0

私はあなたが正しいと信じるように導いています。グローバルな$ x; foo()関数の内部では、noticesエラーも修正されます。私はこれについてのドキュメンテーションのページを見ることに興味があり、なぜPHPはまだコードをうまく実行して管理しているのかを知ることができます。 –

+1

エラーが発生しない理由は簡単です。宣言されていない変数を使用することは、PHPではエラーではありません。常に警告を出して実行を続行します。だから私はいつも私自身のエラーハンドラを宣言し、すべてのエラー/警告/通知について例外をスローする方が好きです。とにかく、良いコードでそれらを生成すべきではありません。 – soulmerge

0

私はほとんど何も定義せずに "$ o。= 'foo'"と一緒に行くので、これらの通知の束を得る。私はerror_reporting(E_ALL^E_NOTICE)でそれらを隠しているだけですが、この場合に最適な方法かどうかはわかりません。

+0

おそらくE_ALL | E_NOTICE、キャレット文字は単項演算子です。 – soulmerge

0

変数と関数が同じファイル内にあっても機能しません。

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" を見ることができます。

関数では、宣言しない限り、グローバル変数は表示されません。

0

はい

あなたの問題を引き起こしているその関数スコープあなたは

include("bar.php"); 

foo("bar.php"); 

を交換する場合、それはにそれを置くので、あなたはすべてが正常に動作していることがわかります現在のスコープではなく機能スコープ