我知道我需要在Smarty 3中使用spl_autoload_register。我在智能初始化后注册我的自动加载功能。但聪明的是尝试使用我自己的自动加载功能而不是smartyAutoload定义的功能。导致错误,因为它显然无法使用我的自动加载找到smarty文件。下面是代码,其中包含其他所有内容,以显示当前的布局。
我确定这只是一个订单安置问题。
<?php
class application {
// include smarty
require_once(SMARTY_DIR.'Smarty.class.php');
// init controller class which initializes smarty
$controller = new Controller();
}
function autoLoader($class) {
// determine what type class it is and call from that directory
$dir = strtolower(strstr($class, '_', true));
$name = substr( strtolower( strstr($class, '_') ), 1 );
switch($dir) {
case 'component':
break;
default:
require_once(LIB_PATH.DS.$name.'.class.php');
break;
}
}
spl_autoload_register("autoLoader");
?>
答案 0 :(得分:2)
如果文件是你的类之一,你可以通过 来使你的自动加载器兼容(这就是spl_autoload_register
的实际用途)。
您可以通过针对命名空间或白名单或is_file
检查类名来实现此目的(将白名单存储在文件系统中):
default:
$path = LIB_PATH.DS.$name.'.class.php';
if (is_file($path)) require_once($path);
break;
答案 1 :(得分:0)
我不知道它是否与您相关,但我将问题跟踪到名为smarty_internal_templatecompilerbase.php
的文件,功能callTagCompiler()
。
我的代码(在* .tpl文件中)调用一个smarty插件函数。我的插件函数名为Load_PO
,这意味着Smarty引擎会搜索名为Smarty_Internal_Compile_Load_PO
的类。
当然,Smarty自动加载器和我的自定义自动加载器都没有找到这个模板。事实上,问题是当找不到文件时我的自动加载程序错误。
问题可以通过两种方式解决:
更改我的自动加载程序以忽略搜索if (substr($class_name,0,24) = 'Smarty_Internal_Compile_')
修改文件smarty_internal_templatecompilerbase.php
,并更改功能callTagCompiler()
,如下所示
更改代码
class_exists ($class_name)
要
class_exists ($class_name, false)