isempty()仅适用于query/builder对象以判断查询条件是否为空,不适用于数组或查询结果;查单条用is_null(find()),查多条用is_array(select())&&empty()。

ThinkPHP 的 isEmpty() 方法到底靠不靠谱
它只对查询构建器对象(Query 或 Builder 实例)有效,不是给数组用的——很多人一查完 select() 就急着调 isEmpty(),结果报错 Call to undefined method isEmpty(),因为返回的是数组,不是查询对象。
真正能用 isEmpty() 的场景只有:还没执行 SQL 前,在链式调用中判断条件是否为空,比如 $this->where($where)->isEmpty()(此时 $this 是 Query 对象);或者用 find()/select() 之前做预判(但极少这么用)。
-
isEmpty()不是「判断结果空」的工具,而是「判断查询条件空」的辅助方法 - 对
find()返回的null、select()返回的[],直接调isEmpty()会抛 Fatal Error - TP6 和 TP8 中该方法行为一致,但文档没写清楚适用边界,容易误导
查完数据库后怎么安全判断「真·没数据」
最稳的方式永远是看返回值本身:查单条用 find(),结果为 null 就是空;查多条用 select(),结果是空数组 [] 就是空。别绕弯子转成对象再判。
常见错误是把 select() 结果丢进 count() 或 empty() 前还强转成对象,反而增加出错概率。TP 自己返回的已经是 PHP 原生类型,没必要再抽象一层。
if (is_null($user = $this->find(123))) { /* 不存在 */ }if (empty($list = $this->where('status', 1)->select())) { /* 无记录 */ }- 避免
empty((array)$result)或!$result->count()—— 转换多余且可能触发隐式转换异常
什么时候必须转数组再判断?
只有一种情况:你主动用了 get() 或 all() 并启用了「自动转换为 Collection」(TP6+ 默认开启),这时返回的是 think\Collection 对象。它有 isEmpty() 方法,但注意——这是 Collection 自己的,和 Query 的 isEmpty() 完全无关。
Collection 的 isEmpty() 等价于 count() === 0,安全可用,但前提是确认你拿到的是 Collection,而不是数组或 null。
- 确认类型:
var_dump($result instanceof \think\Collection) - Collection 下可用:
$result->isEmpty()、$result->count() === 0、$result->count() - 如果配置了
'collection' => false(在 database.php 中),select()就不会返回 Collection,那上面的方法就失效
最容易被忽略的兼容性坑
TP5.1 和 TP6/8 在查询返回类型上默认策略不同:TP5.1 的 select() 默认返回数组;TP6+ 默认返回 Collection(除非显式关掉)。同一套判断逻辑在两个版本里可能一个正常一个报错。
如果你的项目跨版本维护,或者引入了第三方包悄悄改了 collection 配置,empty($result) 看似简单,其实背后依赖的是框架层的返回约定——这个约定并不稳定。
- 最保险的写法是统一用
is_null()判find(),用is_array($x) && empty($x)判select() - 别依赖框架“应该返回什么”,而要检查“实际返回了什么”
- 上线前在目标 TP 版本里跑一遍
var_dump(gettype($this->select())),比看文档更可靠
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











