isset 和 empty 可以传入 undefined 参数返回bool而不报错例如 isset($a['a'])如何自定义一个这样的方法
/**
* 依次从参数中获取默认值
*/
public static function df(){
foreach(func_get_args() as $v){
if( $v===0 || $v===false || !empty($v))return $v;
}
return '';
}
之前思考默认值试过以下写法,结果某些版本php不支持,便放弃了,一度怀疑php是最好的语言
$b=($a+['a'=>1])['a']
1 回答
Smart猫小萌
TA贡献1911条经验 获得超7个赞
echo $a ?? null; // 检查 $a 是否存在,不存在返回 null
上面是变量,下面是数组用法
$arr = ['a' => 1];
$a = $arr['a'] ?? null; // 检查 $arr 数组中的 a key 值是否存在,不存在返回 null
$b = $arr['a']->b ?? null; // 检查 $arr 中 a key 值是否存在,不存在返回 null,如果存在检查 $arr['a'] 对象中是否存在 b, 不存在返回 null。
上面所有的默认是都是 null,当然,你可以选择其他值。
重点来了:
这是补充答案,看了好几遍才看懂题主的意图,不用怀疑,php 就是世界上最好的语言,不报错的方法很简单。
<?php
$b = @$a; // 可以看到,我并没有生命 $a, `$b = null`
$c = @$arr['a']; // 一样,默认值 null
$d = @$obj->d; // 一样,默认值 null
$e = @$arr['a']->e; // 都是可以的
比如,我们有一个数组,$arr, 我们要在 if 里面判断 $arr->a->b 如果存在执行进入if,如下:
$arr = [ 'c' => true ];
if (!! @$arr['a']['b']) {}
缺点嘛,用@
屏蔽了警告。
其次,就是题主说的自定义一个 isset 这样的函数出来,是不可能的。因为自定义函数参数里面的值其实是表达式,运行优先级在函数之前,如果把表达式采用字符串方式传递,就又出现一个难题了,就是变量作用域问题如何解决。
- 1 回答
- 0 关注
- 405 浏览
添加回答
举报
0/150
提交
取消