__autoload катастрофа - конфликты с Joomla - PullRequest
5 голосов
/ 14 июня 2010

Я только что изменил весь свой код, чтобы использовать __autoload, чтобы обнаружить, что он конфликтует с автозагрузчиком joomla.В некоторых случаях я интегрирую свое приложение с joomla для регистрации пользователей и т. Д.

Я обнаружил, что spl_autoload_register (), по-видимому, разрешает много автозагрузчиков.

Что мне делать?

обновление : это то, что делает Joomla

Загружает этот файл из /library/loader.php

function __autoload($class)
{
    if(JLoader::load($class)) {
        return true;
    }
    return false;
}

Обновление 2:

ОК, сразу после загрузки библиотеки Joomla, которую я называю

    require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
    require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

    //autoloader so that it does not interfere with mine
    spl_autoload_register('__autoload');

Вот так выглядит моя автозагрузка:

<?php

//IMPORT
function myAutoload($class_name)
{
    $path = str_replace('_', '/', $class_name);
    include $path . '.php';
}

?>

spl_autoload_register('myAutoload',false,true);

Сначала вызывается моя, а через секунду - Joomla,приложение по-прежнему не может найти классы Joomla.

Обновление 3:

После запуска:

echo "PRE: myAutoload:" . spl_autoload_functions() . "<br />";
spl_autoload_register('myAutoload',false,true);
echo "POST: myAutoload:" . spl_autoload_functions() . "<br />";

и

    echo "PRE: JoomlaAutoLoad:" . spl_autoload_functions() . "<br />";
    //autoloader so that it does not interfere with mine
    spl_autoload_register('__autoload');
    echo "POST: JoomlaAutoLoad:" . spl_autoload_functions() . "<br />";

Мой вывод был следующим: PRE: myAutoload: POST: myAutoload: Array

ОБНОВЛЕНИЕ 4:

Мне пришлось изменить импорт Joomla на это:

    require_once ( JPATH_BASE .DS.'libraries'.DS.'loader.php' );
    echo "PRE: JoomlaAutoLoad:" . var_dump(spl_autoload_functions()) . "<br />";
    //autoloader so that it does not interfere with mine
    spl_autoload_register('__autoload');

            echo "POST: JoomlaAutoLoad:" . var_dump(spl_autoload_functions()) . "<br />";

    require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
    require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

Вот вывод

PRE: myAutoload:
array
  0 => string 'myAutoload' (length=10)
POST: myAutoload:
array
  0 => string 'myAutoload' (length=10)
PRE: JoomlaAutoLoad:
array
  0 => string 'myAutoload' (length=10)
  1 => string '__autoload' (length=10)
POST: JoomlaAutoLoad:

Я решил, что после включения этих файлов Joomla

    require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
    require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

spl_autoload_functions () ничего не возвращает, так что сомкак же Joomla набивает это.

Ответы [ 4 ]

3 голосов
/ 14 июня 2010

Вы должны решить, какая функция автозагрузки должна иметь приоритет над другой, и использовать spl_autoload_register() соответственно (посмотрите на третий аргумент).Как регистрируется функция автозагрузки Joomla?

2 голосов
/ 26 июля 2011

Просто для протокола, только что попробовал это решение, и оно работает для меня в Joomla 1.5:

  1. Перейдите в \ library \ loader.php (160) и заменить

     function __autoload {...}
    

    с

    spl_autoload_register(array('JLoader', 'load'));
    
  2. Теперь вы исправили сторону Joomla. Ты на самом деле сделано, нет шага 2. Но только для записи, я бы перепроверить что ваши собственные библиотеки тоже играют хорошо и используют spl_autoload_register. Если все играют хорошо, должно быть больше нет ссылок ни на какие функции, вызываемые __autoload.

Вуаля. Готово.

Чтобы прочитать четкое и краткое объяснение того, почему это работает, перейдите сюда:

http://www.nicollet.net/2010/06/autoloading-be-friendly-to-intruders/

2 голосов
/ 12 марта 2011

У меня самый простой ответ на этот вопрос, по крайней мере, у меня каждый раз работал на Joomla 1.5.22 ::

require_once ( JPATH_SITE .DS.'libraries'.DS.'loader.php' );
spl_autoload_register('__autoload');

поместите эти две строки перед вашим собственным регистром автозагрузки, чтобы дать предпочтение joomla в стеке

spl_autoload_register('DataMapper::autoload');
0 голосов
/ 05 февраля 2011

Я сделал это по-другому, просто вызвав этот метод во помощнике:

public static function configureZend(){
    $params = self::getParameters();
    $zf_path = $params->get('zend_location');//this should be the zend framework directory location
    define( 'ZFLIBPATH', $zf_path );
    set_include_path( ZFLIBPATH );
    require_once 'Zend/Loader/Autoloader.php';
    $loader = Zend_Loader_Autoloader::getInstance();
    $loader->pushAutoloader(array('JLoader','load'),'');
}

работает нормально, не нужно менять источник ядра joomla, и все выражения Zend работают нормально.

...