Class 'Smarty' not found 的主因是版本混淆:Smarty 3.x 无命名空间,需手动引入 Smarty.class.php;Smarty 4.x 必须用命名空间 \Smarty\Smarty() 并配置四路径,且依赖 Composer autoloader。

Class 'Smarty' not found?先确认你装的是哪个版本
Composer 装完 smarty/smarty 后报这个错,90% 是因为没搞清版本差异:3.x 和 4.x 的加载方式、类名、命名空间完全不兼容。
- 装了
smarty/smarty:^4.0(比如composer require smarty/smarty:^4.3),就必须用new \Smarty\Smarty(),不能写new Smarty() - 装了
smarty/smarty:3.1.49(3.x 最后稳定版),它压根没有命名空间,必须手动require_once主类文件,否则 autoload 根本找不到 - 运行
composer show smarty/smarty看实际安装的版本号,比猜靠谱得多
Smarty 4.x 怎么真正用起来(推荐新项目)
Smarty 4 支持 PSR-4,但默认不会自动注册——得靠 Composer 自动加载机制触发,前提是入口脚本里先引了 autoloader。
-
require __DIR__ . '/vendor/autoload.php';这行不能少,且必须在 new 之前 - 实例化必须带完整命名空间:
$smarty = new \Smarty\Smarty(); - 四个路径必须显式设置,且目录需存在、可写:
$smarty->setTemplateDir(__DIR__ . '/templates')、$smarty->setCompileDir(__DIR__ . '/var/cache/smarty')(注意结尾别加斜杠) - 如果仍报
Class "Smarty\Smarty" not found,检查是否误装了smarty/smarty:3.*—— 4.x 包名一样,但版本约束写错就全白搭
Smarty 3.x 在 Composer 项目里怎么安全接入
别指望 Composer 自动加载 3.x 的类;它靠的是传统 require_once 链式加载,libs 目录结构是硬编码进源码的。
- 执行
composer require smarty/smarty:3.1.49(不要用^3.1,避免意外升到不稳定的快照版) - 在 PHP 文件顶部加:
require_once __DIR__ . '/vendor/smarty/smarty/libs/Smarty.class.php'; - 之后才能用
$smarty = new Smarty();—— 注意:没有use,没有命名空间,就是全局类 - 千万别在
autoload.files里硬写路径,vendor 位置随部署环境变,会挂
模板找不到?和 Composer 无关,但常被误判
Unable to load template 这个错误,100% 是 Smarty 运行时路径配置问题,跟 Composer 安装过程毫无关系。
-
$smarty->setTemplateDir()必须指向一个**真实存在的目录**,里面放着.tpl文件,不是指向某个 tpl 文件本身 - 路径末尾不能有斜杠(
/templates/❌,/templates✅),Smarty 内部拼接逻辑会自己加 - 检查 Web 服务器用户(如 www-data 或 apache)对
templates和compile目录是否有读/写权限,尤其是编译目录——第一次渲染时要生成缓存文件
composer.json 里版本锁不严,第二天就发现 new Smarty() 突然不认得了。










