Smarty类未找到是因版本与用法不匹配:3.x需require_once加载且new Smarty(),4.x需new \Smarty\Smarty()并确认安装版本;模板路径错误则因目录配置或权限问题。

Class 'Smarty' not found?先确认你装的是哪个 Smarty
Composer 装完 smarty/smarty 还报这个错,大概率是版本和用法对不上。Smarty 3.x 和 4.x 完全不是一回事:
• 3.x(如 3.1.49)没命名空间,靠 require_once 加载主类,new Smarty() 才有效;
• 4.x(如 ^4.0)走 PSR-4,类在 Smarty\Smarty 命名空间下,必须写 new \Smarty\Smarty();
• 运行 composer show smarty/smarty 看清楚实际安装的版本号,别只信 composer.json 里写的约束。
composer require 后为啥还是找不到类?手动加载绕不开
Smarty 3.x 的包不声明 autoload,Composer 不会自动包含 Smarty.class.php——它就躺在 vendor/smarty/smarty/libs/Smarty.class.php 里,等着你亲手拉一把:
• 在入口脚本(比如 index.php)顶部加一行:require_once __DIR__ . '/vendor/smarty/smarty/libs/Smarty.class.php';
• 别写 use Smarty;,它不是命名空间类;
• 别在 autoload.files 里硬编码路径,vendor 位置可能随部署环境变化;
• 如果你用的是 Laravel/Symfony,直接上 smarty-labs/smarty-symfony-bundle 这类桥接包,别自己手搓初始化逻辑。
模板路径报 Unable to load template?和 Composer 无关,纯配置问题
这个错误常被误认为是安装失败,其实只是 Smarty 找不到 .tpl 文件,和 Composer 没半毛钱关系:
• $smarty->setTemplateDir(__DIR__ . '/templates') 必须指向一个**目录**,且该目录下得真有 .tpl 文件;
• 路径结尾**不能带斜杠**,Smarty 内部会自己拼,多加一个 / 可能导致路径错位;
• setCompileDir() 和 setCacheDir() 对应的目录必须存在且 PHP 进程有写权限,否则编译失败也会间接表现为模板加载失败;
• 测试时用绝对路径打印一下:var_dump($smarty->getTemplateDir());,眼见为实。
Smarty 4.x 要求更“现代”,但兼容性代价是显式的命名空间
选 4.x 是为了省去手动 require_once,但它把简单问题变复杂了一点:
• 必须用 composer require smarty/smarty:^4.0,~4.3 或 ^4.4 都可以,但不能漏掉 ^ 或写成 4.3.*(后者可能意外拉到 3.x);
• 实例化必须带完整命名空间:$smarty = new \Smarty\Smarty();,写 new Smarty() 就是错;
• 如果项目里旧代码混着 3.x 写法,升级前得全局搜索替换,没有平滑过渡;
• 它不兼容 3.x 的插件目录结构和缓存机制,迁移时插件得重写或适配。
真正麻烦的从来不是 composer require 那一行命令,而是版本语义、加载时机、路径权限这三块拼图没对齐。稍微漏看一眼 composer show 的输出,后面所有调试都在原地打转。








