找不到Smarty_Internal_TemplateCompilerBase

时间:2014-04-30 17:54:12

标签: php smarty composer-php autoload spl-autoload-register

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/vendor/smarty/smarty/distribution/libs/sysplugins/smarty_internal_smartytemplatecompiler.php   在XX线上

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

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

1 个答案:

答案 0 :(得分:0)

最好只有一点决定自动加载,这应该只是Composer。

尝试放置自己的自动加载功能,在composer.json中使用自动加载声明。遗憾的是,您没有使用PSR-0或PSR-4命名标准,但在这种情况下,Composer允许您使用“classmap”。考虑移动所有文件名以符合PSR-0。

智能自动加载应该已经通过Composer要求进行了。无需设定常数。

最后但并非最不重要的是,我认为您的自动加载功能不应返回任何内容。特别是如果它找不到包含该类的文件,它就不应该返回false,因为根据自动加载函数在堆栈中的排序方式,你的函数可能首先被调用所有类,包括所有的Smarty类。如果在这些情况下返回false,则会通过不允许以后的函数加载该类来销毁工作自动加载堆栈。

总而言之,最好将Composer用于所有自动加载。开发人员尽一切努力提供性能最佳的自动加载功能 - 您自己的功能可能只能与他们一样快,但可能会更慢。