3

私が書いたいくつかのクラスの構成ファイルに追加の名前空間「Tracker_」を登録したとします。

autoloadernamespaces[]="Tracker_"

エラー処理をテストしているときを除いて、この名前空間とオートローダーの機能は期待どおりに機能します。存在しないクラスが存在するかどうかをテストするとき、

class_exists("Tracker_DoesNotExist");

例外をスローします

include_once(Tracker/DoesNotExist.php): failed to open stream: No such file or directory
/path/Zend/Loader.php:146
/path/Zend/Loader.php:146
/path/Zend/Loader.php:94
/path/Zend/Loader/Autoloader.php:479
/path/Zend/Loader/Autoloader.php:124
/other/path/TrackablesMapper.php:40 //line referenced above

一方、同じ class_exists 関数は、テストした他のすべてのケースで機能します。

class_exists("Application_ExistingClass"); //returns true
class_exists("Application_NonExistingClass"); //returns false
class_exists("Tracker_ExistingClass"); //returns true

私は何か間違ったことをしていますか?

4

2 に答える 2

6

Zend Framework アプリケーションを実行すると、spl_autoload_register( http://php.net/spl_autoload_register ) を使用してオートローダーが登録されます。これで class_exists の呼び出しは Zend のオートローダーを使用します (デフォルトでclass_existsはクラスをロードしようとします)。

class_exists を withTracker_と notで使用するとエラーが発生するApplication_理由は、Application 名前空間のオートローダーが Zend_Application_Module_Autoloader(Zend_Loader_Autoloader_Resource) によって処理され、Zend_Loaderオートローダーとは少し異なる動作をするためです。

Zend_Loaderいくつかの基本的なセキュリティ チェックを実行してから、単に問題のファイルを含めようとします。リソース オートローダは、実際には、オートロードするファイルが読み取り可能かどうかを最初に確認し、読み取り可能でない場合は、そのファイルを含めようとしないメソッドを使用します。

したがって、エラーが発生する理由はTracker_、自動ロードしようとしたときにエラー チェックが実行されず、エラー チェックがあるためApplication_です。

を呼び出してこれを抑制することもZend_Loader_Autoloader::getInstance()->suppressNotFoundWarnings(true); できますが、後で混乱を招く可能性があるため、通常はこれをオンにしたくありません。

クラスが存在する場合、クラスを含むファイルがまだインクルードされていない場合はクラスが存在しないため、オートローダーが呼び出されます。そのため、最初にロードを試みる必要があり、オートロードに失敗した場合はインクルードを取得します。 zend フレームワークからのエラー。

それがあなたのためにそれを少し片付けたことを願っています。

于 2011-09-22T00:18:36.793 に答える
2

その名前空間内のファイルから任意のクラスを要求するように Zend オートローダーに指示しました。

class_exists()Docsはオートローダーをトリガーします。それを防ぎたい場合は、別のパラメーターを追加します。

class_exists("Tracker_DoesNotExist", FALSE);

Tracker_名前空間 (クラス プレフィックス)からクラスを自動ロードしたくない場合は、それをオートローダーに登録しないでください。

于 2011-09-22T00:05:17.897 に答える