PHP 中用 isset()和 empty()哪个更好

2018-11-09 16:40:28 +08:00
 OMGZui

两者的区别,简单来说就是:

isset(""); // true
empty(""); // true

isset([]); // true
empty([]); // true

isset(false); // true
empty(false); // true

isset(0); // true
empty(0); // true

isset("0"); // true
empty("0"); // true

个人认为empty()更合理,毕竟弱类型,要弱就弱到底呗,但是看到很多地方用isset(),包括那些开源框架

6217 次点击
所在节点    PHP
58 条回复
topzyh
2018-11-09 22:56:59 +08:00
干脆
if ( @$data ) {
}
wuqingdzx
2018-11-09 23:03:55 +08:00
@alex321 高级黑? empty()不会抛出未定义异常
falcon05
2018-11-09 23:17:15 +08:00
如果你把错误报告的等级开到最高,你肯定会留意它们是不一样的
1070794219
2018-11-09 23:33:47 +08:00
empty(空数组) == true, 之前获取某一目录下的文章时,如果当前目录下没有文章(array 为[]),empty 判为 true, isset 为 true
1010011010
2018-11-09 23:50:36 +08:00
都不用。
替代:
if ($foo) {}
if ($foo === null) {}
行为一致,但更简洁

报错?把你 notice 给我关了!
1010011010
2018-11-10 00:00:32 +08:00
当然要判断是否已定义时,还是使用 isset($foo) 而不是 $foo !== null
都是为了可读性,兄弟
JasonTsang
2018-11-10 05:41:58 +08:00
应该是两个不一样的东西吧
isset 不能跟 empty 混用,isset 是用来判断变量是否有定义的
empty 是判断是否为空的
keepeye
2018-11-10 10:12:11 +08:00
顶上去
huobazi
2018-11-10 11:13:09 +08:00
平时都是你们黑 php,一有独秀的机会,都暴露了,都是 phper,哼哼
konakona
2018-11-10 14:22:42 +08:00
谁告诉你 empty 可以一把索?
在强类型的语言里,一个没有声明过的变量拿来用,empty 就会报错。
你可以将 PHP 的报错等级全开,你就明白了。

撇开强弱类型,以 Laravel 这个框架来说。它的等级,也是开的比较高了的。所以你如果写

<?php

//$abc = '123';//隐藏掉声明
var_dump(empty($abc));//一个你没有声明过的变量

是会报错的,所以你要先 if(isset($abc)){var_dump(empty($abc));}

这 2 个函数根本就不是一个意思。
konakona
2018-11-10 14:25:05 +08:00
简单来说,一个未声明过的变量,就是说,一个不存在的东西,不存在就是 null
所以,var_dump($abc === null) 会是 true。

一个不存在的东西,你怎么在程序里用?它会报错!告诉你这个东西不存在。

所以我们可以用 isset($abc) 或者 $abc !== null 来让程序做一个判断,如果为真,代表这个变量存在(也就是声明它存在),那么就可以继续用它去做其他事,比如你说的 empty()。
konakona
2018-11-10 14:28:40 +08:00
isset() 就是 is set 这个意思呀~

相当于是问程序,这个东西是不是(is) 声明过(set)的一个意思!

而 empty(),就是相当于 is this empty ? 就是为里面的东西是不是空的?空是什么意思?空是 null、""、0。

这又引发一个新的思考。

null 就是 void 吗?不是。null 是一个特殊的类型。在其他语言里没有 null,在 php 里 null 被用来代表“无”。

一个未声明的变量,你 var_dump 打印它。在弱环境下,会显示 null。在强类型环境下,会报错。为啥?因为没有声明呀~没有声明就是不可以用~~
konakona
2018-11-10 14:29:38 +08:00
补充一下。
为什么弱环境里可以打印出未声明的变量为 null 这个结果呢?是因为弱类型语言,会自动转换类型。
这是基础中的基础。
konakona
2018-11-10 14:33:14 +08:00
好比方说,我们这个世界不知道什么叫数学的“派”。
在全世界都不知道(没有声明、没有发表、没有通知全世界)的时候,你疯狂的用派。全世界都不知道你想干什么,全世界都乱了。
这就是程序里面为什么要先问“你知道派是什么吗?” 如果程序知道,就继续走用派的流程。如果程序不知道,你就写 else,并且为派声明。告诉大家,派是什么,介绍完毕后,也就能继续正常执行派的流程。
konakona
2018-11-10 14:36:45 +08:00
紧接着上面的例子好了……

而 empty 又怎么理解?

在全世界都知道有派的存在情况下,可能存在有些人只是听说过派,却不了解派。所以它对派的理解是“空”的( null )。

这个时候你可以问这个人:

if(isset($pai)){//你知道派吗?
//他说知道。

if(empty($pay)){//那你懂派吗?
//不懂。。你告诉我
$pay = '3.1415...';
}else{
//我懂
echo $pai ;
}
}
realpg
2018-11-10 22:26:34 +08:00
@OMGZui #18
态度良好 值得表扬

说句题外话,其实看英语字面意思就能理解功能区别的 都不需要翻手册 以后加强英语学习
OMGZui
2018-11-11 14:04:16 +08:00
@konakona 感谢,回答了这么多,我已经理解了
wo642436249
2018-11-12 08:50:53 +08:00
@yiqiao 6666666

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/506182

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX