如果为空,在PHP中一行内使用其他变量

92

在PHP中是否有类似JavaScript的:

alert(test || 'Hello');
所以,当test为未定义或null时,我们将看到Hello,否则-我们将看到test的值。
我在PHP中尝试了类似的语法,但似乎没有正常工作... 而且我不知道如何在Google上搜索这个问题..
谢谢
编辑
我应该补充说明我想在数组内使用它:
$arr = array($one || 'one?', $two || 'two?'); //This is wrong

但实际上,我也可以在这里使用内联 '? :' if 语句,谢谢。

$arr = array(is_null($one) ? "one?" : $one, is_null($two) ? "two ?" : $two); //OK

如果您想创建一个超过3个元素的数组,可以看一下我的答案,避免使用很多三元运算符 ;) - Felix Kling
嗯,显然我会把它放在某种实用函数中;) 谢谢 - Piotr Rochala
13个回答

81

从PHP 7开始,您可以使用称为合并运算符的东西,它可以在不引发?:的E_NOTICE的情况下完全满足您的要求。

要使用它,您可以使用??,它会检查左侧的值是否已设置且不为null。

$arr = array($one ?? 'one?', $two ?? 'two?'); 

81

你可以使用echo $test ?: 'hello';

如果$test为真,它将输出$test,否则输出'hello'

注意:如果$test未设置,它会引发通知或严格错误,但这不应该是问题,因为大多数服务器都设置为忽略这些错误。 大多数框架都有触发这些错误的代码。


编辑:这是一个经典的三元运算符,只是中间部分被省略了。自 PHP 5.3 以来可用。

echo $test ? $test : 'hello'; // this is the same
echo $test ?: 'hello';        // as this one

这仅检查第一个变量的真实性,而不检查它是否未定义,在这种情况下会触发E_NOTICE错误。对于后者,请参阅下面的PHP7答案(希望很快能够在上方显示)。


1
我同意,但是主要的库和插件会经常触发它们,因此它们通常在生产中被忽略。此外,这种类型的错误是 E_NOTICE,可以安全地忽略。我个人不喜欢触发任何类型的错误,包括 E_NOTICE,但这种类型的错误更多的是关于最佳实践,而不是需要修复的实际错误。 - Yamiko
我知道过早优化是不好的,但触发通知会导致调用错误处理函数(无论是 PHP 的默认函数还是自定义函数),即使该函数最终由于您的 error_reporting 设置而忽略了错误,这也会很慢,特别是在循环内执行时。 - thomasrutter
这个 ?: 运算符叫什么?有人能提供文档链接吗? - inafalcao
也称为“Elvis运算符” :D - Charles Wood
1
很好,我以前不知道这个。你可以说?:就像+=一样是对=的补充...有点儿类似。 - Agent Friday
显示剩余2条评论

63

3
为什么要检查 !$test 而不是直接使用 $test ? $test : 'hello'; 呢? - AndrewKS
4
如果$test未定义或为空,他希望看到“Hello”。即使$test的值为int(0),他仍然会看到"Hello",尽管它已经被设置且不为空,因为在PHP中将 0 解释为 false,除非你使用 ===。为了安全起见,他应该检查$test是否已设置且不为空。至少这是我的逻辑。 - Jeff Busby
我理解你的意思,但是你的解决方案非常令人困惑 :( 。根据“如果在PHP中一行中使用其他变量,则为空则不应接受答案”的规定,它不应该被接受。@yamiko的答案非常简单且有用。 - Santi
这里的 || is_null() 是多余的,isset($var) 如果 $var 为 null 将返回 false。 - Arth

10
依据最新版本,使用此代码进行速记:
$var = $value ?? "secondvalue";

1
是的!感谢您提供这个答案。看起来空值合并运算符是在PHP 7中添加的。https://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.coalesce - phip
对于 PHP >7 来说,这绝对是最干净的方法! - CodeNinja

6

一行代码。易读性超强,适用于普通变量、数组和对象。

// standard variable string
$result = @$var_str ?: "default";

// missing array element
$result = @$var_arr["missing"] ?: "default";

// missing object member
$result = @$var_obj->missing ?: "default";

看它如何运作:Php沙盒演示


5

我非常惊讶其他答案没有提出这个建议:

echo isset($test) ? $test : 'hello';

从文档中可以得知isset($var) 如果 $var 不存在或者被设置为 null,会返回 false

PHP 7 及以上版本引入了空合并运算符,如 @Yamiko 所述,它是上述语句的语法快捷方式。

在这种情况下:

echo $test ?? 'hello'; 

1
如果你想用这种方式创建数组,array_map 提供了一种更简洁的方法来实现这一点(取决于数组中元素的数量):
function defined_map($value, $default) {
    return (!isset($value) || is_null($value)) ? $default : $value;
    // or return $value ? $default : $value;
}

$values = array($one, $two);
$defaults = array('one', 'two');

$values = array_map('defined_map', $values, $defaults);

只需确保您知道哪些元素会评估为false,这样您就可以应用正确的测试。


1
自 PHP7.4 版本开始,你可以使用空合并赋值运算符,从而可以这样做:
$arr = array($one ??= "one?", $two ??= "two ?");

查看此处的文档


0

好的,将您提供的符号扩展开来,意思就是:

if (test) {
    alert(test);
} else {
    alert('Hello');
}

所以这只是一个简单的if...else结构。在PHP中,您可以将简单的if...else结构缩短为称为“三元表达式”的东西:

alert($test ? $test : 'Hello');

显然,在PHP中没有JS的alert函数的等价物,但结构是相同的。


0

也许有更好的方法,但这是我想到的第一件事:

 echo (!$test) ? "Hello" : $test;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接