0

spl_autoload が呼び出されていますが、問題は 2 番目の autoload が実行されず、その理由がわかりません。このコードを使用すると、スクリプトは停止するはずです。フォルダー配列からクラスを削除すると、オートロードが機能します。私のコードは次のようになります。

<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors','On'); 
/*** nullify any existing autoloads ***/
spl_autoload_register(null, false);
/*** specify extensions that may be loaded ***/
spl_autoload_extensions('.php');

function dataLoader($class) {
    foreach (array(PV_CORE.DS.'data'.DS, PV_CORE.DS.'system'.DS, PV_CORE.DS.'cms'.DS, PV_CORE.DS.'util'.DS,PV_CORE.DS.'components'.DS, PV_CORE.DS.'template'.DS) as $folder){
        if (is_file($folder.$class.'.php')) {
            include_once $folder.$class.'.php';
        }
    }//end foreach
}

function testLoader($class) {
    die();
    $filename = $class. '.php';
    $file =PV_CORE.DS.'data'.DS.$filename;
    if (!file_exists($file)) {
        return false;
    }
    require_once $file;
}

spl_autoload_register('dataLoader');
spl_autoload_register('testLoader');
4

2 に答える 2

1

あなたのコードは機能しますが、おそらく誤解です。

関数が登録されました:

print_r( spl_autoload_functions() );

戻り値:

Array
(
    [0] => dataLoader
    [1] => testLoader
)

クラスを初期化する場合

$class_obj = new ClassName();

dataLoader はファイルをロードしようとします:

$folder.ClassName.php

最初にクラスが見つからない場合、スクリプトは 2 番目またはその他の登録済み関数のみをロードします。

したがって、関数 dataLoader で $class を削除すると、__autoload は最初に登録された関数でクラスを見つけられなくなるため、2 番目に登録された関数でクラスを検索しようとします。

于 2011-10-07T05:58:44.537 に答える
1

必要がある

true を返します。// クラスがロードされ、オートロード スタックを停止したい場合

false を返します。// クラスがロードされておらず、autoload スタックの実行を継続したい場合

コールバック内

お役に立てれば

于 2011-10-07T06:05:06.740 に答える