2

奇妙な問題があります。クラスをロードする静的メソッド(load_library)があります。特定のクラスをロードすると、「クラスを再宣言できません」という致命的なエラーが発生しますが、load_libraryメソッドを使用してクラスをロードする直前にクラスが存在するかどうかをテストすると、クラスが存在しないと表示されます。このload_libraryメソッドは、そのようなエラーなしで他の場所で機能します。

load_libraryの呼び出しを取得すると、数行後にクラスが実際に使用されたときにクラスが見つからないと表示されます。見知らぬ人ですが、代わりに登録済みのクラス関数を削除すると、この関数はロードしようとしているクラスが含まれているディレクトリをチェックしなくてもautoload、すべてが完全に機能します。autoload

これは多くのファイルが関係する複雑な問題であるため、コードを投稿するのは困難ですが、この問題は他の人にはなじみのある匂いがしますか?

私のload_libraryメソッド:

    public static function load_library($name) {
        if (!class_exists($name)) {
            if (file_exists('application/libraries/' . $name . '.php')) {
                include('application/libraries/' . $name . '.php');
            } else {
                trigger_error('Request made for non-existant library ('.$name.').', E_USER_ERROR);
            }
        }
    }

load_libraryメソッドの呼び出し:

lev::load_library('lev_unit_tester/lev_base_test');

登録した自動ロード方法:

    public static function autoloader($name) {
        if (class_exists($name)) return;
        if (file_exists('application/libraries/' . $name . '.php')) {
            include('application/libraries/' . $name . '.php');
        }
    }

ロードしようとしているクラス(これはエラーが発生する場所です):

abstract class lev_base_test {

}

実際のエラーメッセージ:

致命的なエラー:5行目の/some/path/application/libraries/lev_unit_tester/lev_base_test.phpでクラスlev_base_testを再宣言できません

4

2 に答える 2

0

load_libraryこの方法でメソッドを呼び出しています:

lev::load_library('lev_unit_tester/lev_base_test');

class_exists()これは、-というクラスがあるかどうかをテストしていることを意味します。lev_unit_tester/lev_base_testこれはおそらく完全には当てはまりません。これはクラスの有効な名前ではありません。

したがって、;をclass_exists()返します。そのため、メソッドが呼び出されるfalseたびに、クラスを含むファイルをインクルードしようとします。load_library


オートロードを使用している場合は問題ありません。PHPは、定義されていないクラスを使用しようとしたときにのみオートローダーを呼び出すためです。クラスに対応するファイルが含まれると、オートロードは呼び出されません。再びそのクラス。

于 2011-03-28T04:42:59.303 に答える
0

これを試して

// Check to see whether the include declared the class
    if (!class_exists($class, false)){..}
于 2011-03-28T04:44:08.533 に答える