Smarty 3和spl_autoload_register

时间:2011-09-28 16:28:44

标签: php smarty autoload

我知道我需要在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");

?>

2 个答案:

答案 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自动加载器和我的自定义自动加载器都没有找到这个模板。事实上,问题是当找不到文件时我的自动加载程序错误。

问题可以通过两种方式解决:

  1. 更改我的自动加载程序以忽略搜索if (substr($class_name,0,24) = 'Smarty_Internal_Compile_')

  2. 修改文件smarty_internal_templatecompilerbase.php,并更改功能callTagCompiler(),如下所示

  3. 更改代码

    class_exists ($class_name)
    

    class_exists ($class_name, false)