2009-09-01 6 views
6

を含み、これは動作しない。拡張クラスファイル

test.phpを:

include_once('test-include.php'); 

$main = new mainClass(); 

//====================================================================== 
class mainClass { 
    function __construct() { 
     $test2 = new Test2(); 
     echo $test2->var; 
    } 
} 

//====================================================================== 
class Test2 extends Test1 { // test2 
    var $var = 'b'; 
} 

試験include.php:

// this does get printed out, so I know the include statement is working 
echo 'DEBUG: this is the test-include.php file<br>'; 

//====================================================================== 
class Test1 { // test1 
    var $var = 'a'; 
} 

以下のエラーが発生します。

この一方

動作しない

test2.php:

// this is in the same position as the include statement in test.php 
//====================================================================== 
class Test1 { // test1 
    var $var = 'a'; 
} 

$main = new mainClass(); 

//====================================================================== 
class mainClass { 
    function __construct() { 
     $test2 = new Test2(); 
     echo $test2->var; 
} 
} 

//====================================================================== 
class Test2 extends Test1 { // test2 
    var $var = 'b'; 
} 

はなぜそれを拡張して、子クラスが見つからないために、インクルードファイルで原因基底クラス(Test1と)を置くん ?つまり、最初の例では、インスタンス化しようとするとTest2が見つからないため、失敗しています。このようなことは、まだコード実行フローでTest2に慣れていないので意味があります。しかし、2番目の例(include文なし)では、これは似たような状況ですが、エラーはありません(まだコード実行のTest2クラスに達していません)。

ああ、バージョン5.1.6 。

UPDATE:

OK、DAFFが正しいか - 私はtest.phpを例に最後まで

$main = new mainClass(); 

を移動した場合、それが動作します。上記の行が最後でなければ、なぜそれがうまくいかないのか知りたいのですが、最後に$ main = new mainClass()行がないtest2.phpの例でうまくいきます。

UPDATE 2:

OK、私はinclude_onceの代わりにrequire, require_onceincludeを使用して試してみた - これらの作品のどれも。また、私はtest-include.phpファイルにテスト用のecho文を追加し、インクルード文が動作していることを知ったので、プリントアウトします(存在しないインクルードファイルについてはエラーが出ません)。

+0

本当にインクルードが機能していますか? – Rufinus

+0

どうして失敗するのですか?コンパイルエラー、実行エラー、エラーはないが間違った結果? – Lucky

+0

"require"を使用すると何が表示されますか? "echo"これはtest-include.phpです; " "test-include.php"の先頭に? "test-include.php"は同じディレクトリにありますか?あなたのインクルージョンパスにありますか? – GZipp

答えて

6

これは定義の順序と関係があり、実際に作業する前にすべてのクラスを含める必要があります。

$main = new mainClass(); 

スクリプトの最後に、すべてのクラスが既に定義されているためインクルードファイルでも正常に動作します。最終的には、小さな関数でこれらの問題を取り除くため、PHP autoload関数を見てください。

+1

私は質問の部分はクラス定義の順序は両方の例で同じだと思いますが、一方は動作し、もう一方は動作しません。 –

+0

申し訳ありませんが、Alanは正しいです。私は、test2.phpを修正して、test.phpにあるinclude文と同じ場所に基本クラス(Test1)を置くようにテストしました。この場合、test2.phpはまだ動作しますが、 PHPがインクルードしていると思ったとおりに動作しない限り(つまりインクルードされたファイルのコードがインクルードステートメントのどこに挿入されていないか)、注文の問題ではありません。 – Bill

+0

OK定義の順序が良い言葉です。処理を開始する前に、オートローディングするか、少なくともすべてのクラスファイルを含めることをお勧めします。 – Daff

4

OK、私はこれを考え出したかもしれないと思います。バグ糸の端ポスターの言葉のクラスは、それらが使用された後に定義されたが、PHP 5のためにすることはでき

http://bugs.php.net/bug.php?id=30453

はPHP 4、::

PHP5このバグレポートによると、 が使用された後にそれをサポートします] と互換性がありますが、すべての組み合わせについては のサポートは予定していません。

私はこの特定のケースがサポートされていない組み合わせの1つであると推測しています。

0

最初にinclude_once()を使用してインデックスファイル内のすべてのファイルを追加し、どのクラスを拡張する場合でも、その親クラスを最初にインスタンス化します。
例:

index.php--> 
<?php 
    include_once('parentClass.php'); 
    include_once('childClass.php'); 

    $parentObj = new parent(); 
    $childObj = new child(); 
?> 

child.php--> 
<?php 
    class child extends parent{ 
    function __construct(){ 

    } 
    } 
?>