PHP 中如何优雅的处理未定义变量

2015-06-07 14:06:40 +08:00
 fbzl
没有使用框架的老程序中经常会有获取$_GET['id'],而id确不存在,开启报错时,都会看到好多报错。

一种最原始的手动判断(一大坨,影响逻辑的代码)

写一个判断变量是否存在的函数(用的时候感觉怪怪的)

另一种情况是未知成员对象引用也会报错


PS:开发环境拒绝关闭报错
6440 次点击
所在节点    PHP
27 条回复
shiny
2015-06-07 14:08:46 +08:00
最低等:isset
中级: filter_input
终极:开发框架集成自动处理
AlloVince
2015-06-07 14:18:21 +08:00
$params = array_merge(['id' => ''], $_GET);

if ($params['id'])
...
zhengkai
2015-06-07 14:42:25 +08:00
$_GET += [
'id' => 0,
'page' => 1,
];
zhengkai
2015-06-07 14:46:28 +08:00
这种方法一般不用在 _GET _POST 上,因为网页参数要做很多处理,没有特别声明的整数要禁止负数,字符串要确保是 utf-8 的,等等

一般用在参数上, += 不仅仅是比 array_merge() 简短,还能避免一个坑。如果你的 key 恰好是 0,1,2 这种的,+= 是覆盖,array_merge 的话会给你搞出 3,4,5,3 个 key 变成 6 个 key ……
MntCw
2015-06-07 15:30:40 +08:00
@shiny 调用函数也分低高级,也是醉了。

业务逻辑理清楚,在用到相应变量时提前做处理。
三元操作符还是挺好用的。
fbzl
2015-06-07 15:34:26 +08:00
@shiny

isset 有一个坑是在赋值为 null 时 会返回 false

@zhengkai

数字key无法合并,好坑

+= 在php 5.4才开始可以用,开始用5.3.29测试 报错(囧

---

前期先用楼上的方法顶着,后期会重构自动处理,每次传值看起来都不爽
shiny
2015-06-07 15:49:04 +08:00
@MntCw 这个自己写个几年体会咯
moro
2015-06-07 16:06:08 +08:00
@
b821025551b
2015-06-07 16:17:31 +08:00
empty配合三目
em70
2015-06-07 16:20:35 +08:00
error_reporting(0)
世界不就清静了
zhengkai
2015-06-07 16:33:00 +08:00
@fbzl 5.4 才能用的是 array() 可以写成 [],+= 应该是一直能用的
yangmls
2015-06-07 17:18:41 +08:00
fbzl
2015-06-07 17:25:24 +08:00
@zhengkai 手册上写的

array

(PHP 4, PHP 5)
array — Create an array

---

As of PHP 5.4.x you can now use 'short syntax arrays' which eliminates the need of this function.

Example #1 'short syntax array'
<?php
$a = [1, 2, 3, 4];
print_r($a);
?>

---



@b821025551b

empty()会提示'PHP Notice: Undefined index: id',就是为了避免这个问题的,我才问的


@em70

问题描述中特别指明了,不能关闭报错
fbzl
2015-06-07 17:52:16 +08:00
@yangmls

本来准备去成熟框架中找的,但是没时间去找,之后也准备用`Laravel`重构

代码中

return value($default);

value 是自定义的吗?PHP中好像没有这个函数
yangmls
2015-06-07 17:57:51 +08:00
yangmls
2015-06-07 17:59:54 +08:00
楼上的 merge 方案无法处理多重数组的情况,而 laravel 能够简单地用 array_get($arr, 'foo.bar') 来获取

楼上的 isset 问题也考虑到了,所以用的 array_key_exists
fbzl
2015-06-07 18:03:56 +08:00
@yangmls

难道我搜索姿势不对,在Github上搜了195个结果,看了四五页就看不下去了
yangmls
2015-06-07 18:05:55 +08:00
@fbzl 搜索什么?
micate
2015-06-07 18:14:37 +08:00
自己实现一个类似 laravel 的 array_get() 方法是比较方便的,而且也不费电呀。
geeglo
2015-06-07 18:22:27 +08:00
$id = empty($_GET['id']) ? 1 : intval($_GET['id']);

这样写不会报错的呀~你是不是记错了?

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

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

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

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

© 2021 V2EX