2011-10-07 2 views
0

У меня есть функция spl_autoload, но проблема в том, что вторая автозагрузка не выполняется, и я не могу понять, почему. С этим кодом этот код должен умереть. Я удаляю классы из массива папок, автозагрузка будет работать. Мой код выглядит так:spl_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'); 
+0

Ваши функции регистр: print_r (spl_autoload_functions()); Я действительно не понял, что вы пытаетесь сделать. – Talisin

ответ

1

Ваш код работает, но, вероятно, недоразумение.

Ваши функции регистрации:

print_r(spl_autoload_functions()); 

возвращается:

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

и если вы инициализировать класс

$class_obj = new ClassName(); 

dataLoader будет пытаться загрузить файл:

$folder.ClassName.php 

Ваш скрипт загружает только вторую или любую другую зарегистрированную функцию, если он не может найти класс в первую очередь.

Так что если вы удалите свой $ class в функции dataLoader __autoload, то не найдете этот класс в первой зарегистрированной функции, чтобы он попытался найти его во второй зарегистрированной функции и так далее.

+0

Да, я предположил, что spl_autoload загружает все закрытые, но он загружается по требованию, когда класс не может быть найден. –

1

необходимо

return true; // если класс загружен и вы хотите, чтобы стек автозагрузки был остановлен

return false; // если класс не загружен, и вы хотите, чтобы продолжить выполнение стека автозагрузку

внутри ваших обратных вызовов

надеюсь, что это помогает