前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP为什么empty可以访问不存在的索引

PHP为什么empty可以访问不存在的索引

作者头像
烟草的香味
发布2021-01-06 10:16:34
6430
发布2021-01-06 10:16:34
举报
文章被收录于专栏:烟草的香味

开始之前, 先抛出问题:

代码语言:javascript
复制
$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函数的颜色不一样. 而emptyecho是相同的颜色, 那不就是说他们俩是一类货色么. 再看一下:

有没有发现什么? PHP中的关键字用的就是这个颜色. 我仿佛明白了些什么.

随后, 我就去翻了翻官方文档, 还真让我发现了些许的端倪, 在empty函数的文档下, 有这样一段:

虽然我不知道语言构造器是什么, 但是函数我知道啊. 而官方文档中也提出了, empty不是一个函数, 那么, 上面拿他当做函数来进行分析显然就不对了.

语言构造器

那么现在问题来了, 什么是语言构造器呢? 简单来说, 就是 PHP 所定义的那些关键字. 虽然用法看起来像函数, 但是在调用的时候直接映射到预先定义好的一系列操作, 而不会像函数一样进行传参等等解析操作.

再看一个可以展示其区别的例子:

代码语言:javascript
复制
$isArrFun = 'is_array';
var_dump($isArrFun(2));
$empFun = 'empty';
var_dump($empFun(1));

结果:

在第二次调用的时候, 报错: 没有empty方法. 是不是仿佛懂了些什么, 进一步验证它并不是函数.

既然语言构造器是一些预定义操作, 那么大概率要比函数的调用更有效率. 所以, isset 要比array_key_exists更快. 刚刚想到这个问题的时候, 我还疑惑了一下, 既然有更有效率的方式, 那array_key_exists函数存在的意义是什么呢? 想了想, 看这段:

代码语言:javascript
复制
$arr = [
    'a' => null,
];
var_dump(isset($arr['a']));
var_dump(array_key_exists('a', $arr));

当元素为null的时候, issetfalse. 而array_key_exists函数返true. 明白了...

判断

你要问我怎么判断是函数还是语言构造器, 编译器显示的颜色已经很好的提示你了.

如果你用的编辑器提示并不完善, 那么将名字传给function_exists 看一下就行了, 如果不是函数, 又能调用, 那自然就是后者了.


之前被这个问题困扰过几天, 今天下定决心一定要研究研究, 还行, 找到了... 简单了解一下, 也算解了心中的小困惑. 是我小看了empty老兄, 一直以为它只是一个小小的函数, 没想到竟然是关键字, 失敬失敬.

对了, 再悄悄告诉你, PHP 中, 系统函数是可以被重新定义的, 只要你写一个同名函数就行, 但是关键字这几个老兄不吃这一套哦.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 烟草的香味 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 语言构造器
  • 判断
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档