原生PHP的index.php通常以直接输出HTML或简单逻辑处理为主,而框架型(如ThinkPHP、CodeIgniter)的index.php则侧重引导加载、环境配置、常量定义及核心文件引入。

直接观察入口文件执行路径差异
打开项目根目录,对比index.php内容:原生PHP的index.php通常以run();。
这一步不需要修改任何代码,仅靠查看就能确认——【若入口文件里没出现vendor/autoload.php和start.php,就不是TP6】。
检查请求生命周期中是否经过框架调度器
在app/middleware/HelloMiddleware.php中写入一行日志:file_put_contents(runtime/log/hello.txt, 'hit');,然后访问任意URL。若该文件被创建并写入内容,说明请求已进入TP6中间件链;原生PHP项目根本不存在middleware目录,更不会自动执行中间件。
注意:TP6中间件必须返回Response对象,否则会中断流程;原生PHP中你随便echo都不会影响后续脚本执行。
立即学习“PHP免费学习笔记(深入)”;
这一步验证的是框架是否存在“统一入口+分发调度”机制,而不是靠判断有没有某个类名。
运行时动态检测容器是否激活
方法一:在任意控制器方法中插入代码var_dump(class_exists('think\Container'));
方法二:执行php think optimize:schema命令,若提示“Command 'optimize:schema' is not defined”,说明未识别TP6命令行环境;原生PHP连think命令都不存在。
方法三:在Web请求中调用\think\Container::getInstance()->get('app'),能返回App对象即为TP6;原生PHP直接报Fatal error: Class 'think\Container' not found。
【TP6所有服务必须经Container解析,new \app\service\UserService()在未绑定前必然失败】。
数据库操作痕迹比对
第一步:在控制器中执行Db::table('user')->where('id', 1)->find();
第二步:开启调试模式(config/app.php中debug设为true),刷新页面后查看runtime/log/sql/下的最新SQL日志文件。
第三步:对比日志内容——TP6会记录完整预处理语句如SELECT * FROM `user` WHERE `id` = ?,参数单独列出;原生PHP若用mysqli直接拼接,则日志里只会看到SELECT * FROM `user` WHERE `id` = 1这样的明文SQL。
第四步:故意传入含单引号的ID(如id=1' OR '1'='1)再次请求,TP6日志中WHERE条件仍为?占位符,而原生拼接SQL会直接爆出语法错误或查出异常数据。



















