我刚刚更改了所有代码以使用__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
我不得不将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不知怎的就把它填满了。
答案 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中适用于我:
转到\ libraries \ loader.php(160) 并替换
function __autoload {...}
与
spl_autoload_register(array('JLoader', 'load'));
瞧。完成。
要阅读有关其工作原理的简明扼要解释,请转到此处:
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都可以正常工作。