<?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从未声明或赋值)
1
kslr 2015-02-23 14:12:05 +08:00 via Android
可以啊 empty和isset作用是一样的,如果什么都不做处理就会有警告或者错误
|
2
lincanbin 2015-02-23 14:17:00 +08:00 via Android
Isset的功能是empty的子集,empty同样有检测变量是否定义的功能,Isset是为了避免变量未定义的情况下使用
If($str == 1) 这种情况会抛出一个可以忽略的异常,整个判断部分是不会执行的。 你忽略了错误当然可以继续执行,可以以后运行上出现了什么偏差,你要负责。 |
3
raincious 2015-02-23 14:18:43 +08:00
楼主,这是我活生生用脸皮换来的答案:
https://www.v2ex.com/t/67309#reply48 |
4
viko16 2015-02-23 14:22:20 +08:00
|
5
Kilerd 2015-02-23 14:52:40 +08:00
E_ALL,必须打开,这样才可以保证在所有环境下的正常运行
我一般都是先isset,再去判断使用变量 If(isset($str)&&''<>$str){ do something... } |
6
bombless 2015-02-23 16:58:29 +08:00
最开始我也以为很多情况下不写isset也没差。
后面写着写着就发觉还是必须加isset,某些情况下用empty替代。 反正楼主写对多了也许就改了,如果写了很多还是没改,那说明不写的那种方式实际更适合你。 |
7
MaiCong 2015-02-23 18:47:23 +08:00
function _isset($str){
return isset($str) && !empty($str) ? $str : null; } if(_isset($str)){ //do something... } |
8
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`,有什么错误马上就能报告出来 |
9
zhengkai 2015-02-23 19:58:40 +08:00
缩进没了……我还一直能支持 markdown,原来只是主贴有
|
10
raincious 2015-02-23 21:49:19 +08:00 via Android
@MaiCong
这样仍然是错的。 isset是一种语法结构,只是看起来像是函数。他会进行变量(在变量表上)检查,而自己却不操作变量(包括读)。你定义的函数需要这个变量确实存在才能被压入执行栈(压入的时候就会给你E_NOTICE了)。 一个毫无意义的"绕过"方法是让你的_isset接受一个Reference,接口变成这样: function _isset(&$str) 这样可以确保不会丢出E_NOTICE,但实际上仅仅是因为PHP在压入$str这个Reference的时候发现没有而自动建立了一个变量而已。而这个Reference指向的值默认是NULL,isset对NULL返回false,于是你的函数 *看起来* 是工作了。 如果你想进行一句话检查变量是否为空,那么直接用empty。然后你可以用is_string检查那个值是不是真的是string。 |
11
rming 2015-02-23 22:04:13 +08:00
两个习惯:
1.对用户输入检查 isset($_POST['key']); 2.变量使用前声明 $tmp = null; $arr = []; $str = ''; |
12
Mars 2015-02-24 03:02:48 +08:00
依稀记得 多年以前看过一个文章,说用isset更保险。。。
|
13
bingfan 2015-02-24 03:22:45 +08:00
isset和empty在我们项目中都是禁止使用的函数,数组建议用array_key_exists,字符串直接if($str)
|
14
cevincheung 2015-02-24 15:24:27 +08:00
都不预定义变量的么?
$str = $input->get('xxx'); func get: return empty($_GET..... |
15
curiousjude 2015-02-25 08:53:55 +08:00
@bingfan 能具体说一下为什么禁止吗?
|
16
picasso250 2015-03-05 15:32:58 +08:00
@bingfan 你这个规定很奇葩呀。。。
|
17
picasso250 2015-03-05 15:36:18 +08:00
楼主你还是代码写的少。
当然,你肯定不服气。那就发明一个新语言吧。或者Haskell之类的有Maybe类型也不错的。 |
18
vishun 2016-12-12 16:56:08 +08:00 1
if(isset($str) && !empty($str))没必要这样写,直接 if(!empty($str))就可以。
php 的 manual 中也说明了:"没有警告会产生,哪怕变量并不存在。 这意味着 empty() 本质上与 !isset($var) || $var == false 等价。",所以加上 isset 多此一举。 |