php 中见好多人判断变量需先判断 isset,这步能不能省略呢?

2015-02-23 14:02:36 +08:00
 jookr

<?php
error_reporting(E_ALL);

//下面省略不写isset($str),直接用empty判断如果$str不为空就干活也不会报错(即使变量$str从未声明或赋值),是否就是真的能省略不写isset($str)呢?或是为了需要向下兼容php版本(低版本----变量从未声明或赋值就empty($str)会报错)?

if(isset($str) && !empty($str)){
//do something...

}

简单就是想问 isset($str)能不能省略不写 直接判断(即使$str从未声明或赋值)

5006 次点击
所在节点    PHP
18 条回复
kslr
2015-02-23 14:12:05 +08:00
可以啊 empty和isset作用是一样的,如果什么都不做处理就会有警告或者错误
lincanbin
2015-02-23 14:17:00 +08:00
Isset的功能是empty的子集,empty同样有检测变量是否定义的功能,Isset是为了避免变量未定义的情况下使用
If($str == 1)
这种情况会抛出一个可以忽略的异常,整个判断部分是不会执行的。
你忽略了错误当然可以继续执行,可以以后运行上出现了什么偏差,你要负责。
raincious
2015-02-23 14:18:43 +08:00
楼主,这是我活生生用脸皮换来的答案:
https://www.v2ex.com/t/67309#reply48
viko16
2015-02-23 14:22:20 +08:00
文档里就有对比
http://php.net/manual/zh/function.empty.php

另外,
不要为少打一两句代码而偷懒,没准以后你要为这花费百倍的时间去 fix
Kilerd
2015-02-23 14:52:40 +08:00
E_ALL,必须打开,这样才可以保证在所有环境下的正常运行
我一般都是先isset,再去判断使用变量

If(isset($str)&&''<>$str){
do something...
}
bombless
2015-02-23 16:58:29 +08:00
最开始我也以为很多情况下不写isset也没差。

后面写着写着就发觉还是必须加isset,某些情况下用empty替代。

反正楼主写对多了也许就改了,如果写了很多还是没改,那说明不写的那种方式实际更适合你。
MaiCong
2015-02-23 18:47:23 +08:00
function _isset($str){
return isset($str) && !empty($str) ? $str : null;
}
if(_isset($str)){
//do something...
}
zhengkai
2015-02-23 19:57:45 +08:00
首先是 !empty 和 isset 只需要一个

还有就是多设缺省值,比方说数组的

function foo($bar) {
$bar += [
'a' => 0,
'b' => 12,
];
if ($bar['a'] > 5) { // 如果没有上面的 +=,这行就可能报错

还有就是,引用到空值不会报错,但记得引用完要 unset

$count =& $foo['bar']['key'];
if ($count) {

处理 notice 是挺烦的,但是任何 notice 都是需要解决的问题,要么规避错误,要么屏蔽错误(比方说跟网络相关的函数,你没法确认 $s = file_get_contents($url) 的各种网络问题,那就直接 @file_get_contents,然后着重检查 $s,从 PHP 5.4 以后 @ 的开销已经没bug了)

建议开发的时候第二个显示器一直 `tail -f php_error.log`,有什么错误马上就能报告出来
zhengkai
2015-02-23 19:58:40 +08:00
缩进没了……我还一直能支持 markdown,原来只是主贴有
raincious
2015-02-23 21:49:19 +08:00
@MaiCong

这样仍然是错的。

isset是一种语法结构,只是看起来像是函数。他会进行变量(在变量表上)检查,而自己却不操作变量(包括读)。你定义的函数需要这个变量确实存在才能被压入执行栈(压入的时候就会给你E_NOTICE了)。

一个毫无意义的"绕过"方法是让你的_isset接受一个Reference,接口变成这样:
function _isset(&$str)
这样可以确保不会丢出E_NOTICE,但实际上仅仅是因为PHP在压入$str这个Reference的时候发现没有而自动建立了一个变量而已。而这个Reference指向的值默认是NULL,isset对NULL返回false,于是你的函数 *看起来* 是工作了。

如果你想进行一句话检查变量是否为空,那么直接用empty。然后你可以用is_string检查那个值是不是真的是string。
rming
2015-02-23 22:04:13 +08:00
两个习惯:
1.对用户输入检查 isset($_POST['key']);
2.变量使用前声明
$tmp = null;
$arr = [];
$str = '';
Mars
2015-02-24 03:02:48 +08:00
依稀记得 多年以前看过一个文章,说用isset更保险。。。
bingfan
2015-02-24 03:22:45 +08:00
isset和empty在我们项目中都是禁止使用的函数,数组建议用array_key_exists,字符串直接if($str)
cevincheung
2015-02-24 15:24:27 +08:00
都不预定义变量的么?


$str = $input->get('xxx');

func get:
return empty($_GET.....
curiousjude
2015-02-25 08:53:55 +08:00
@bingfan 能具体说一下为什么禁止吗?
picasso250
2015-03-05 15:32:58 +08:00
@bingfan 你这个规定很奇葩呀。。。
picasso250
2015-03-05 15:36:18 +08:00
楼主你还是代码写的少。

当然,你肯定不服气。那就发明一个新语言吧。或者Haskell之类的有Maybe类型也不错的。
vishun
2016-12-12 16:56:08 +08:00
if(isset($str) && !empty($str))没必要这样写,直接 if(!empty($str))就可以。
php 的 manual 中也说明了:"没有警告会产生,哪怕变量并不存在。 这意味着 empty() 本质上与 !isset($var) || $var == false 等价。",所以加上 isset 多此一举。

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

https://www.v2ex.com/t/172297

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

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

© 2021 V2EX