Class not found 是因 phpqrcode.php 为纯函数库,无命名空间与类定义,不兼容 ThinkPHP 5.0.21 的 PSR-4 自动加载;需用 require_once 显式引入并调用函数式接口(如 qrCode()),而非 QRcode::png()。

为什么直接 require phpqrcode.php 会报错 Class not found
ThinkPHP 5.0.21 默认使用 PSR-4 自动加载,而原版 phpqrcode 是纯函数库,没有命名空间、没有类定义、也没有 __autoload 或 require_once 依赖管理。直接 require 后调用 QRcode::png() 必然失败——因为根本不存在 QRcode 这个类。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 不要把
phpqrcode.php放进app/或extend/下指望自动加载 - 改用
include_once或require_once显式引入,并确认路径正确(推荐放在public/static/qrcode/或vendor/下) - 引入后只能调用函数式接口,例如
QRcode::png()不可用,但qrCode()函数可用(取决于你用的是哪个分支版本)
如何在控制器里安全生成二维码图片并返回 HTTP 响应
TP5 的响应类不支持直接输出二进制图像流,硬写 header("Content-type: image/png") + echo $data 容易被框架的输出缓冲干扰,导致图片损坏或空白。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 先用
QRcode::png()(如果类存在)或QRcode::text()+ob_get_contents()捕获输出,再用 TP5 的response()包装 - 更稳妥的做法:生成临时文件,再用
return response()->file($filepath) - 务必设置
ob_end_clean()清除前置输出,避免 BOM 或空格污染 PNG 流 - 示例关键代码:
ob_start(); QRcode::png('https://example.com', false, QR_ECLEVEL_L, 4, 2); $imageData = ob_get_contents(); ob_end_clean(); return response($imageData)->contentType('image/png');
QR_ECLEVEL_L 等常量未定义怎么办
原版 phpqrcode 把常量定义在 qrconst.php 中,但很多精简版包(比如某些 Composer 版本)漏掉了这个文件,导致 QR_ECLEVEL_L、QR_FORMAT_PNG 等直接报错 undefined constant。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 检查是否完整引入了
qrconst.php和qrtools.php,缺一不可 - 若用的是 GitHub 上的
phpqrcode/phpqrcodeComposer 包(非官方),它已重写为命名空间类,应改用endroid\qr-code替代 - 临时补救:手动定义缺失常量,例如
defined('QR_ECLEVEL_L') || define('QR_ECLEVEL_L', 0); - 注意:不同版本的容错等级数值可能不同,
QR_ECLEVEL_H在老版中是 3,新版可能是 2 —— 查源码比硬记更可靠
生成中文内容二维码乱码或报错 QRcode::png() expects parameter 1 to be string
原生 phpqrcode 只接受 UTF-8 字符串,但 ThinkPHP 5.0.21 默认模板编码和部分输入(如 GET 参数)可能是 GBK 或未转码,直接传入会导致内部 mb_strlen() 失败或生成乱码方块。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 强制转码:
$content = mb_convert_encoding($content, 'UTF-8', 'auto'); - 避免直接传数组或对象,
json_encode($data, JSON_UNESCAPED_UNICODE)后再传入 - 若内容含 URL,确保已
urlencode(),否则斜杠、问号等会破坏二维码结构 - 测试时先用纯英文字符串验证流程是否通,再逐步加入中文和特殊字符
phpqrcode 这种“裸写”型库最容易在缓冲、编码、常量作用域上翻车。别迷信文档里的“一行搞定”,先确认你手上的到底是哪个版本的 phpqrcode,再决定走函数调用、临时文件还是换库。



















