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');

person Devin Dixon    schedule 07.10.2011    source источник
comment
Ваши функции зарегистрированы: print_r(spl_autoload_functions()); Я действительно не понял, что вы пытаетесь сделать.   -  person Talisin    schedule 07.10.2011


Ответы (2)


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

Ваши функции зарегистрированы:

print_r( spl_autoload_functions() );

возвращает:

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

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

$class_obj = new ClassName();

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

$folder.ClassName.php

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

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

person Talisin    schedule 07.10.2011
comment
Да, я предполагал, что spl_autoload загружает все закрытия, но загружается по требованию, когда класс не может быть найден. - person Devin Dixon; 13.10.2011

тебе нужно

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

вернуть ложь; // если класс не загрузился и вы хотите продолжить выполнение стека автозагрузки

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

надеюсь это поможет

person Community    schedule 07.10.2011