为了账号安全,请及时绑定邮箱和手机立即绑定

能否写类似 isset empty 自定义php 方法

能否写类似 isset empty 自定义php 方法

PHP
慕田峪9158850 2019-03-12 16:21:11
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 这样的函数出来,是不可能的。因为自定义函数参数里面的值其实是表达式,运行优先级在函数之前,如果把表达式采用字符串方式传递,就又出现一个难题了,就是变量作用域问题如何解决。
查看完整回答
反对 回复 2019-03-18
  • 1 回答
  • 0 关注
  • 400 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信