Smarty_Internal_TemplateCompilerBase not found



composer.json:

{
  "require": {
    "smarty/smarty": "v3.1.17"
  }
}

index.php:

define('SMARTY_SPL_AUTOLOAD', 1); // now smarty should use its own autoloader
require_once __DIR__ . "/vendor/autoload.php";
function my_classes_loader($class) {
  $path = "{$class}.class.php";
  if (file_exists($path)) {
    include_once $path;
    return true;
  }
  return false;
}
spl_autoload_register('my_classes_loader');
$smarty = new Smarty();
$smarty->setCompileDir("templates_c");
$smarty->display('main.html');
exit();

如果我在浏览器中打开它,我会得到

致命错误:在中找不到类"Smarty_Internal_TemplateCompilerBase"//smarty example/vvendor/smarty/smarty/distribution/libs/sysplugins/smarty_internal_martytemplatecompiler.php在线XX

文件就在那里。它有内容。对于PHP等来说,它是可访问/可读的

我做错了什么?缺少什么?

最好只有一点来决定自动加载,而这应该是Composer单独完成的。

尝试收起您自己的自动加载函数,在composer.json中使用自动加载声明。不幸的是,您没有使用PSR-0或PSR-4命名标准,但Composer允许您在这种情况下使用"classmap"。请考虑移动所有文件名以符合PSR-0。

智能的自动加载应该已经通过Composer来完成了。不需要设置那个常数。

最后但同样重要的是,我认为您的自动加载函数不应该返回任何内容。特别是,如果找不到它认为包含该类的文件,它不应该返回false,因为根据自动加载函数在堆栈上的排序方式,您的函数可能会首先被所有类调用,包括所有Smarty类。如果在这些情况下返回false,则不允许以后的函数加载该类,从而破坏了正在工作的自动加载堆栈。

所以总的来说,最好使用Composer进行所有的自动加载。开发人员尽一切努力提供性能最好的自动加载功能——您自己的功能可能只能和他们的一样快,但可能会更慢。

相关内容

  • 没有找到相关文章

最新更新