我想要分配一个尚未分配的变量。 PHP执行以下操作的方式是什么?
$result = null;
$result ||= check1();
$result ||= check2();
$result ||= "default";
我检查了standard operators和is_null函数,但似乎没有一种简单的方法可以执行上述操作。
答案 0 :(得分:17)
isset()
是通常的做法:
if (!isset($blah)) {
$blah = 'foo';
}
注意:您可以将null
分配给变量,然后分配该变量。这会因isset()
和is_null()
而产生不同的结果,因此您需要明确“未分配”的含义。见Null vs. isset()。这也是一种需要注意自动类型转换的情况,这意味着使用!=/==
或===/!==
取决于所需的结果。
您也可以使用布尔速记(Perl ||=
运算符就是这样)。从PHP 5.2.x开始,没有像你这样的运营商。在Perl:
$a ||= $b;
相当于:
$a = $a || $b;
您可以在PHP中执行第二种形式,但PHP有一些关于type juggling的简单规则。见Converting to boolean:
转换为boolean时, 以下值被视为FALSE:
- boolean
FALSE
本身- integer 0(零)
- float 0.0(零)
- 空string和string“0”
- 一个零元素的array
- object,其成员变量为零(仅限PHP 4)
- 特殊类型
NULL
(包括未设置的变量)- SimpleXML从空标签创建的对象
其他每个值都被视为TRUE(包括任何资源)。
所以之后:
$a = 0;
$a = $a || 5;
$ a等于5.同样:
$a = 0;
$b = '';
$c = $a == $b; // true
$d = $a === $b; // false
你必须注意这些事情。
答案 1 :(得分:14)
isset($foo) || $foo = 'bar';
答案 2 :(得分:5)
从php 5.3开始,您可以使用:
$result = $result ?: check1();
答案 3 :(得分:1)
我想出了这个函数,它有一个副作用,就是关闭无用的未定义变量通知。它足够接近Javascript对我的行为:
function default_value(&$var, $default) {
return isset($var) ? $var : $default;
}
$want_something = default_value($_POST['mightbeunset'], false);
答案 4 :(得分:0)
如何使用几个嵌套的三元运算符?
对我而言,这是处理问题的最简单方法。由于您可以使用嵌套的三元运算符,因此您应该能够在需要时添加更多检查。
$var = isset($var) ? $var : ($i=check1()) ? $i : ($i=check2()) ? $i : "default" ;
这几乎是相同数量的代码,它应该工作..除非我误解了你。如果是这样的话我很抱歉。
与您作为示例发布的原始代码相比,长度几乎相同:
$result = null; $result ||= check1(); $result ||= check2(); $result ||= "default";
- vs -
$var = isset($var) ? $var : ($i=check1()) ? $i : ($i=check2()) ? $i : "default" ;
嵌套的三元运算符可能有点令人困惑,所以在这里你可以得到注释:
// Is $var set?
$var = isset($var) ?
// TRUE: It is, use $var
$var :
// FALSE: $var is not set, run check1
( $i=check1() ) ?
// TRUE: the function check1 returned valid data
$i :
// FALSE: the function check1 returned null or false, run check2
($i=check2()) ?
// TRUE: the function check2 returned valid data
$i :
// FALSE: the function check1 returned null or false, set default value
"default" ;
答案 5 :(得分:0)
我还没有尝试过,但多年来一直想和PECL Operator一起玩。