Isset()/ Empty(),数组和三元运算符

时间:2013-04-09 04:39:59

标签: php

当你需要检查数组中是否有任何值,如果没有 - 设置变量的默认值,你可以这样做

$authToken = isset($response['fbData']['authResponse']['accessToken']) ? $response['fbData']['authResponse']['accessToken'] : null;

我想知道,有什么方法可以让它更具可读性吗?

有三元运算符的简短版本

$authToken = $sourceVar ?: null;

第二次不需要重复源代码,但它不适用于数组,因为如果我使用$response['fbData']['authResponse']['accessToken']代替$sourceVar - 我会收到php警告消息。

我可以使用@

$authToken = @$response['fbData']['authResponse']['accessToken'] ?: null;

我听说他们在PHP 5.4中确实很快“@”,但我不喜欢这样。

我可以使用这样的东西

$a = isset($response['fbData']['authResponse']['accessToken']) ?: null;

但在这种情况下,我会得到TRUE作为结果,isset()的结果。

所以,也许有人知道,怎么做呢?

Upd1:建议的主题How can I create a new operator in PHP?不能解答我的问题,因为用户会询问“如何更改PHP”并创建新的运算符。我不需要这个。有一些答案如何在没有PHP修改的情况下做类似的事情,但它们对数组不起作用(我不能在函数中传递这样的$response['fbData']['authResponse']['accessToken'],因为它会生成警告信息)。

更新2:问题已解决,感谢NikiC(请参阅下面的评论)。 想法:如果我将数组元素作为链接传递,Php将不会生成警告消息,因此它让我们有机会使用这样的东西:

function myIsset (&$var, $defaultVal = null) {
    return isset($var) ? $var : $defaultVal;
}

$authToken = myIsset($response['fbData']['authResponse']['accessToken']);

UPD2 2015年10月27日: PHP 7有一个新的非常棒的运算符??(null coalesce运算符)完全解决了这个问题并且是最好的方法:它返回它的第一个操作数,如果它存在且不是NULL;否则它返回第二个操作数。

$authToken = $response['fbData']['authResponse']['accessToken'] ?? 'any_default_value';

如果请求的数组键没有退出 - 它不会生成php notice

您也可以像这样使用它,寻找非空值:

$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';

0 个答案:

没有答案