跳到主要内容
PHP

!和empty()行为有什么区别?

管

管理员

https://segmentfault.com/q/1010000005077073

2020年02月15日 3,033 次阅读
本页目录

首先习惯性地,RTFM

没有好不好,只有合适不合适

!和empty()行为有什么区别?

他们的行为有3个差异

  1. 空SimpleXML (经过实验,发现这是文档问题,php5.1后,两者行为是一致的)

  2. 未定义的变量 (!$undefined会产生error,empty($undefined)则返回true) 和isset类似,这个特性对于访问复杂结构的数组或对象成员的时候特别友好(empty($arr['userModel']->userFriends))

  3. php5.5之前,empty只接受变量,不接受表达式(比如函数的返回结果empty(getSomething()))

评论里也有人说了,因为empty是语言结构,并没有函数调用的巨大开销,所以两者的性能的差异不会太大,另外现代PHP对于这种小的开销也已经优化地很好了,所以这里不怎么需要考虑性能。结合上面的分析来说,empty是优于!的,除非你的php版本比较老,而又需要对表达式直接判断,不希望多加一个变量

但是,如果你并不知道你手里的东西是不是数组,建议参考 @dreamans 的答案,考虑$arr并非数组的场景做合适的处理。

因为is_array并不具有empty的耐受未定义的特性,我推荐这种写法empty($arr) && is_array($arr)
能够严谨地支持各种场景

if(empty($undefined) && is_array($undefined));//未定义变量
if(empty($arr['userModel']->userFriends) && is_array($arr['userModel']->userFriends));//(潜在)未定义成员

//或者反向场景,判断有内容数组,结合表达式的能力
if(!empty($things = getSomething()) && is_array($things));

当然,更好的风格是用typehinting代替is_array,一定是array且一定定义过,情况好得多

Related

相关文章

同分类文章 →
2026年07月11日 PHP

laravel什么样的方法适合放在模型中?什么适合用专门的服务类? cachedFavIds适合放在模型中吗?

一、适合放在模型中的方法Laravel 采用 ActiveRecord 风格,模型本身就是"数据 + 围绕该数据的操作"的载体。以下几类方法适合放模型: 关联关系:belongsTo、morphTo、hasMany 等。如 UserFav::userfavable()、UserFav::us

2026年04月13日 PHP

Vue3 静态文件放在同域名 Laravel 项目下

核心思路是:Vue3 构建后的静态文件放到 Laravel 的 public/ 目录下,通过 Laravel 路由的 catch-all 机制让 SPA 的前端路由正常工作。方案说明以 xx.com/admin 为例,整体架构如下:请求流程:xx.com/admin/* → Laravel

2025年08月18日 PHP

Laravel Eloquent 中可以通过静态方式调用的方法

在 Laravel Eloquent 中,可以通过静态方式调用的方法包括:1. 查询作用域 (Scopes)// 可以静态调用UserComment::active()->get();UserComment::where('status', 1)->first();2. Eloquent 内置的查询方法UserComment::fi

WeChat

扫码加我微信

微信二维码