__autoload灾难 - 与Joomla发生冲突

时间:2010-06-14 12:44:26

标签: php autoload

我刚刚更改了所有代码以使用__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 个答案:

答案 0 :(得分:3)

您应该决定哪个自动加载功能优先于另一个,并相应地使用spl_autoload_register()(查看第三个参数)。如何注册Joomla自动加载功能?

答案 1 :(得分:2)

我对这个问题有最简单的答案,至少每次为joomla 1.5.22工作 ::

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

将这两行放在您自己的自动加载寄存器之前,以便在堆栈中提供joomla优先级

spl_autoload_register('DataMapper::autoload');

答案 2 :(得分:2)

只是为了记录,只是尝试了这个解决方案,它在Joomla 1.5中适用于我:

  1. 转到\ libraries \ loader.php(160) 并替换

     function __autoload {...}
    

    spl_autoload_register(array('JLoader', 'load'));
    
  2. 现在你已经修复了Joomla的一面。你真的 完成后,没有第2步。但只是为了记录,我会仔细检查 你自己的图书馆也玩得很好 spl_autoload_register。如果每个人都玩得很好应该有 不再引用任何名为__autoload的函数了。
  3. 瞧。完成。

    要阅读有关其工作原理的简明扼要解释,请转到此处:

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

答案 3 :(得分:0)

我做了其他方式,只是在帮助器中调用此方法:

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 clases都可以正常工作。