2016-09-13 11 views
0

this questionからの応答に基づいて、私のコードは動作すると期待しますが、何らかの理由でそれが期待できません。クラスのライブラリからクラスを継承する単純なクラスがあります。PHPは、拡張クラスをオートロードする

_custom.php

$custom = new MyClass(); 
class MyClass extends MyAbstractClass{ 

    public function __construct(){ 
     parent::__construct(); 
    } 

} 

残念ながら、私は、この致命的なエラーが出る:

Fatal error: Class 'MyClass' not found in ...

をしかし、私はextends MyAbstractClassを削除した場合、エラーが表示されなくなります。クラスを拡張しようとすると、MyAbstactClassがロードされないため、MyClassがまったく見つからないという問題があるようです。

これに関するご意見やご提案はありますか?

+0

エラーが消えてしまったか、クーラー/デバッガを1つ表示するのが難しいですか? – bassxzero

+0

また、オートローダコード – bassxzero

+0

を表示する必要があります。予想通りに 'MyClass'オートロードよりも拡張を削除すると... – Xtremefaith

答えて

0

PHPは、解釈される言語です。つまり、PHPが定義するは、として知られているものは、文の前に解析されたコードです。あなたは、オブジェクトが呼び出されると定義されていない場合は、オートローダーを使用することによって、この動作を防ぐことができますクラスと

class MyClass extends MyAbstractClass{ 

    public function __construct(){ 
     parent::__construct(); #you are forcing a construct call, it is not required if the parent constructor has no args. 
    } 

} 

$custom = new MyClass(); 

は、それが注入に試してみて、自分の与えられたコードでクラスを解析します。

マジック関数__autoload()を定義することができますが、__autoload()関数のように動的で一定ではないので、spl_autoload_register()がより動的です。

+0

私は、 'spl_autoload_register()'を使用する前にその順序で作業したことが奇妙であると思っています。この現在のリファクタでは、オートロードを実装しました。しかし、それはすべて重要です。説明ありがとう。 – Xtremefaith

+0

クラス名を含むファイルが含まれていれば* IF *になります。個人的に私はPS4オートロードクラスを使用して、より効率的にするためにそれを修正しました。それは名前空間によるクラスを含み、それがどのフォルダに入っているかを定義します。したがって、クラス内から\ lib \ db \ statement'を使用すると、 "webroot \ lib \ db"から "statement.php" \ "ディレクトリにあります。 – Xorifelse