Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP是否具有与| |=运算符等价的运算符?_Php - Fatal编程技术网

PHP是否具有与| |=运算符等价的运算符?

PHP是否具有与| |=运算符等价的运算符?,php,Php,我想分配一个变量,但它还没有被分配。PHP执行以下操作的方式是什么 $result = null; $result ||= check1(); $result ||= check2(); $result ||= "default"; 我检查了和函数,但似乎没有一种简单的方法来执行上述操作。是执行此操作的常用方法: if (!isset($blah)) { $blah = 'foo'; } 注意:您可以将null赋值给变量,变量将被赋值。这将对isset()产生不同的结果,因此您需要明确“

我想分配一个变量,但它还没有被分配。PHP执行以下操作的方式是什么

$result = null;
$result ||= check1();
$result ||= check2();
$result ||= "default";
我检查了和函数,但似乎没有一种简单的方法来执行上述操作。

是执行此操作的常用方法:

if (!isset($blah)) {
  $blah = 'foo';
}
注意:您可以将
null
赋值给变量,变量将被赋值。这将对
isset()
产生不同的结果,因此您需要明确“未分配”的含义。看见在这种情况下,您还需要小心进行自动类型转换,这意味着使用
=/==
====/==取决于所需的结果

您也可以使用布尔速记(这就是Perl
| |=
运算符的含义)。在PHP5.2.x中,没有像您所说的那样的操作符。在Perl中:

$a ||= $b;
相当于:

$a = $a || $b;
您可以用PHP编写第二个表单,但是PHP有一些关于表单的时髦规则。见:

转换为时 以下值被认为是错误的:

  • FALSE
    本身
  • 0(零)
  • 0.0(零)
  • 空的和“0”
  • 具有零元素的数据集
  • 具有零成员变量(仅限PHP 4)的
  • 特殊类型(包括未设置的变量)
  • 从空标记创建的对象
其他所有值均视为真(包括任何资源)

因此,在:

$a = 0;
$a = $a || 5;
一美元等于五美元。同样地:

$a = 0;
$b = '';
$c = $a == $b; // true
$d = $a === $b; // false

你必须注意这些事情。

使用两个嵌套的三元运算符怎么样

对我来说,这是解决你问题的最简单方法。由于您可以使用嵌套的三元运算符,因此如果需要,您应该能够添加更多的检查

$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" ;

我还没有尝试过,但已经想玩很久了。

从PHP5.3可以使用:

$result = $result ?: check1();

我提出了这个函数,它有关闭无用的未定义变量通知的附带好处。对我来说,这已经足够接近Javascript的行为了:

function default_value(&$var, $default) {
    return isset($var) ? $var : $default;
}

$want_something = default_value($_POST['mightbeunset'], false);

$a=0$a=$a | | 5;回声$a;//真奇怪。。。echo$a==5?“true':'false';//true-but-echo$a-1;//0很抱歉发表评论。。。echo$a==6?“true':'false';//true,因此比较的整数似乎正在转换为布尔值,而不是布尔值转换为数值。我知道自动类型转换有点不可靠,但这绝对不是我期望的行为。无论如何,我认为很明显$a=$a | | 5并不像广告宣传的那样有效。不过,它在Javascript中确实是这样工作的。这很酷。这似乎很明显,但我从来没有想过尝试它。嵌套的三元运算符应该会导致一个
UnreadableOverflowException
function default_value(&$var, $default) {
    return isset($var) ? $var : $default;
}

$want_something = default_value($_POST['mightbeunset'], false);