8

カスタムフレームワークの開発に取り組んでいます。そして、クラスの呼び出しを動的にしようとしたときに問題が発生しました。

これは私のファイルのビジュアルです:

ここに画像の説明を入力

そこで、各フォルダー (libs、controllers、modeles) ごとに異なる関数を作成することにしました。

function autoloadLibs($class) {
    //require the general classes
    require 'libs/' . $class . '.php';
}

function autoloadModels($class) {
    //require the models classes
    require 'models/' . $class . '.php';
}

function autoloadControllers($class) {
    //require the controllers classes
    require 'controllers/' . $class . '.php';
}

spl_autoload_register ('autoloadLibs');
spl_autoload_register ('autoloadControllers');  
spl_autoload_register ('autoloadModels');

それにもかかわらず、私はこのメッセージを持っています: Warning: require(libs/admin.php): failed to open stream , もちろん、それは良いフォルダではありません. しかし、それを修正する方法がわかりません。クラスの呼び出しを最適化する良い方法はありますか?

4

6 に答える 6

12

いくつかのテストの後、私は私の場合にこの解決策を見つけました:

set_include_path(implode(PATH_SEPARATOR, array(get_include_path(), './libs', './controllers', './models')));
spl_autoload_register();
于 2012-10-17T17:15:32.283 に答える
5

is_file()ファイルを試す前に、まずファイルが存在することを確認する必要がありますrequire

を使用する場合spl_autoload_register()、ファイルをインクルードするメソッドを 1 つ登録する方が一般的に優れていることがわかりました。複数の機能を bing できるという事実は、さまざまなライブラリとの相互運用性を容易にするためです (したがって、それらは clobber しません__autoload())。また、ファイルの存在を確認したり、ディレクトリセパレーターにマップしたりするためにコードを何度も書き出す必要がなくなります_(そうする場合)。

したがって、ファイル名を の規則に合わせて変更すると仮定するとUnderscore_Separated_Name、たとえばController_Admin_Dashboardを使用できます...

function autoload($className) {

    $path = SYSPATH .
            str_replace("_", DIRECTORY_SEPARATOR, strtolower($className)) . 
            ".php";

    if (is_file($path)) {
        require $path;
    }

}

初めてインスタンス化するときにController_Admin_Dashboard、PHP に/app/controller/admin/dashboard.php.

于 2012-10-16T11:59:38.077 に答える
5

複数の呼び出しがある場合は、キーワードをspl_autoload_register使用してファイルをインクルードしないようにする必要があります。これは、「ファイルをインクルードするか、できない場合は終了する」ことを意味するためです。require

個人的には、オートロード機能が 1 つしかないという点については、特にコントローラとライブラリ ディレクトリなど、異なる場所からクラスを含める場合に、他の意見に同意しません。また、最初にファイルが存在するかどうかを確認してから、それを含めます。

tl;dr バージョン:spl_autoload_register呼び出しが互いにブロックすることを許可しないでください。

于 2012-10-16T12:09:12.117 に答える
1

ファイルを要求する前に、クラス名を確認する必要があります。次に例を示します。

function autoloadControllers($class) {
    //require the controllers classes
    if( substr( $class, -10) == 'Controller')){
        require 'controllers/' . $class . '.php';
    }
}

クラスをロードできない場合にエラーが発生するのは正しいと思いますが、require正しいパスでのみ呼び出されるようにする必要があります。

于 2012-10-16T12:01:09.147 に答える