1

作曲家.json:

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

索引.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();

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

致命错误:在第 XX 行的 //smarty-example/vendor/smarty/smarty/distribution/libs/sysplugins/smarty_internal_smartytemplatecompiler.php 中找不到类“Smarty_Internal_TemplateCompilerBase”

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

我究竟做错了什么?什么不见​​了?

4

1 回答 1

0

只有一个点决定自动加载是个好主意,这应该是 Composer 一个人。

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

智能自动加载应该已经通过 Composer 要求它来完成。无需设置该常数。

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

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

于 2014-05-01T17:35:06.413 回答