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

Pav*_*vel 5 php

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

$authToken = isset($response['fbData']['authResponse']['accessToken']) ? $response['fbData']['authResponse']['accessToken'] : null;
Run Code Online (Sandbox Code Playgroud)

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

有三元运算符的简短版本

$authToken = $sourceVar ?: null;
Run Code Online (Sandbox Code Playgroud)

这里不需要第二次重复源,但它不适用于数组,因为如果我将使用$response['fbData']['authResponse']['accessToken']而不是$sourceVar- 我将获得php警告消息.

我可以用 @

$authToken = @$response['fbData']['authResponse']['accessToken'] ?: null;
Run Code Online (Sandbox Code Playgroud)

我听说他们让"@"真的很快PHP 5.4,但我还是不喜欢这个.

我可以使用这样的东西

$a = isset($response['fbData']['authResponse']['accessToken']) ?: null;
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我将得到TRUE作为结果,结果isset().

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

Upd1:推荐主题如何在PHP中创建新运算符?不是我的问题的答案,因为用户询问"如何更改PHP"并创建一个新的运算符.我不需要这个.有一些答案如何在没有PHP修改的情况下做类似的事情,但它们不适用于数组(我不能$response['fbData']['authResponse']['accessToken']在函数中传递这样的东西,因为它会生成警告消息).

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

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

$authToken = myIsset($response['fbData']['authResponse']['accessToken']);
Run Code Online (Sandbox Code Playgroud)

UPD2 10/27/2015: PHP 7有一个新的令人敬畏的运算符??(空合并运算符)完全解决了这个问题并且是最好的方法:它返回它的第一个操作数,如果它存在并且不是NULL; 否则返回第二个操作数.

$authToken = $response['fbData']['authResponse']['accessToken'] ?? 'any_default_value';
Run Code Online (Sandbox Code Playgroud)

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

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

$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
Run Code Online (Sandbox Code Playgroud)