MENU

【转载】PHP 由 empty 和 isset 面试题引起的思考

July 12, 2022 • Api接口

在我们的 php 面试中,一面基础面中经常会有面试官问 empty 和 isset 的区别,往往大家都是简单的说出两者的用法,其实如果深入进问题的本质,我认为不仅仅可以让面试官顺着你走,可能还会给面试官一种惊艳的感觉
empty — 检查一个变量是否为空
当变量存在,并且是一个非空非零的值时返回 false 否则返回 true
以下变量都被认为是空
' ' (空字符串)
0 (作为整数的 0)
0.0 (作为浮点数的 0)
"0" (作为字符串的 0)
null
false
array() (一个空数组)
$var; (一个声明了,但是没有值的变量)

isset — 检测变量是否已设置并且非 null
如果变量存在并且值不是 null 则返回 true,否则返回 false
这里我们会发现 empty 和 isset 细节的区别其实就在 为空 和为 null
所以只要我们能区分 空 和 null 的概念就非常容易理解这两个函数的区别
事实上 为空包含了为 null 这个感念,为 null 只有变量未声明和赋为null 这两种
在这里细心的同学就会问,false 是为空,为什么同为布尔类型的 true 并不为空呢?
其实很简单 因为 true 虽然类型为布尔类型但值不为0
而 false 0.0 "0" '' null 虽然类型各异,但值都为 0 所以他们为空

<?php

$array = [0.0, '0', '', null, false];

$len = count($array);

for ($i = 0; $i < $len; $i++) {
    if (0 == $array[$i])
        echo 'yes' . PHP_EOL;
    else
        echo 'no' . PHP_EOL;
}

验证结果会输出 5 个 yes ,而把 == 改为 === 后会输出 5 个 no
这里就引申到了我们 php 类型判断了
php 是怎么进行类型判断的呢?这其实和 php zval 结构体有关系
由于 php 类型推断需要细说,所以类型推断下次会再给大家详细介绍

转载自:learnku