PHP为什么empty可以访问不存在的索引
开始之前, 先抛出问题:
$arr = [];
echo 'empty: ', PHP_EOL;
var_dump(empty($arr['1']));
echo 'is_array: ', PHP_EOL;
var_dump(is_array($arr['1']));
这段代码的运行结果:
你是否和我有过同样的疑问? 同样是函数, 为什么empty
访问不存在的索引就不会报错呢? 按理说哈, 函数调用的时候, 会将将参数传值过去吧, 也就是说两个函数的调用第一步, 都是要把$arr['1']
这个内容取出来吧, 那又为什么一个能拿出来一个拿不出来呢?
不懂就要问, 然后我就这个传参的问题各种搜索, 也没有找到想要的答案. 但是, 冥冥中我是感觉他们是有区别的, 你要问我为什么, 来:
有没有发现, 编译器在显示的时候, empty
函数和is_array
函数的颜色不一样. 而empty
和echo
是相同的颜色, 那不就是说他们俩是一类货色么. 再看一下:
有没有发现什么? PHP
中的关键字用的就是这个颜色. 我仿佛明白了些什么.
随后, 我就去翻了翻官方文档, 还真让我发现了些许的端倪, 在empty
函数的文档下, 有这样一段:
虽然我不知道语言构造器
是什么, 但是函数
我知道啊. 而官方文档中也提出了, empty
不是一个函数, 那么, 上面拿他当做函数来进行分析显然就不对了.
语言构造器#
那么现在问题来了, 什么是语言构造器
呢? 简单来说, 就是 PHP 所定义的那些关键字. 虽然用法看起来像函数, 但是在调用的时候直接映射到预先定义好的一系列操作, 而不会像函数一样进行传参等等解析操作.
再看一个可以展示其区别的例子:
$isArrFun = 'is_array';
var_dump($isArrFun(2));
$empFun = 'empty';
var_dump($empFun(1));
结果:
在第二次调用的时候, 报错: 没有empty
方法. 是不是仿佛懂了些什么, 进一步验证它并不是函数.
既然语言构造器
是一些预定义操作, 那么大概率要比函数的调用更有效率. 所以, isset
要比array_key_exists
更快. 刚刚想到这个问题的时候, 我还疑惑了一下, 既然有更有效率的方式, 那array_key_exists
函数存在的意义是什么呢? 想了想, 看这段:
$arr = [
'a' => null,
];
var_dump(isset($arr['a']));
var_dump(array_key_exists('a', $arr));
当元素为null
的时候, isset
返false
. 而array_key_exists
函数返true
. 明白了...
判断#
你要问我怎么判断是函数还是语言构造器, 编译器显示的颜色已经很好的提示你了.
如果你用的编辑器提示并不完善, 那么将名字传给function_exists
看一下就行了, 如果不是函数, 又能调用, 那自然就是后者了.
之前被这个问题困扰过几天, 今天下定决心一定要研究研究, 还行, 找到了... 简单了解一下, 也算解了心中的小困惑. 是我小看了empty
老兄, 一直以为它只是一个小小的函数, 没想到竟然是关键字, 失敬失敬.
对了, 再悄悄告诉你, PHP 中, 系统函数是可以被重新定义的, 只要你写一个同名函数就行, 但是关键字这几个老兄不吃这一套哦.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY