PHP为什么empty可以访问不存在的索引
2020-12-19 19:08
281 查看
开始之前, 先抛出问题:
$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是相同的颜色, 那不就是说他们俩是 ad8 一类货色么. 再看一下:
有没有发现什么?
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看一下就行了, 如果不是函数, 又能调用, 那自然就是后者了.
之前被这个问题困扰过几天, 今天下定决心一定要研究研究, 还行, 找到了... 简单了解一下, 也算解了心中的小 ad8 困惑. 是我小看了
empty老兄, 一直以为它只是一个小小的函数, 没想到竟然是关键字, 失敬失敬.
对了, 再悄悄告诉你, PHP 中, 系统函数是可以被重新定义的, 只要你写一个同名函数就行, 但是关键字这几个老兄不吃这一套哦.
相关文章推荐
- 为什么有时ping不通www baidu com但可以访问www baidu com网页
- # 深入理解Java中为什么内部类可以访问外部类的成员#
- 深入理解Java中为什么内部类可以访问外部类的成员
- centos7.0 可以访问HTML文件,不能访问PHP文件,因为php-fpm没有扩展包
- 为什么有时ping不通www.baidu.com但可以访问www.baidu.com网页?
- PHP安全编程:留心后门URL 直接可以通过URL访问(转)
- 深入理解Java中为什么内部类可以访问外部类的成员
- wsdl地址是什么意思?是否可以通过浏览访问?为什么别人可以通过浏览器访问,我的不行 ,求高手解答
- C++ Primer 5th: 拷贝构造函数为什么可以访问传入对象的私有变量
- php 通过__callstatic访问不存在的静态方法,并映射到真正的方法上
- PHP数组可以用中文索引
- C++中类的访问权限针对的是类而不是对象!(为什么类中的函数可以访问对象的私有成员?)
- 为什么mysql设置了密码之后,本地还可以直接访问,不需要输入密码就可以登录数据库了?
- bool operator==(fun &a){if(this->a==a.a&&this->b==a.b)//为什么a.a可以访问a的私有成员
- 深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量
- 为什么域名能够访问网站,而直接使用IP不可以
- 在一个服务器上搭建好php环境,在服务器上可以访问,其他机器可以访问服务器但网页无法访问
- Struts2的访问路径为什么可以用.action或不写,以及Struts2访问路径的搜索方式
- 为什么 PHP 中 this 和 self 访问变量的写法不一样?
- web方式可以访问,php命令行模式访问有问题