php 逻辑运算符,||还是手术室?

lvjbypge  于 2022-12-02  发布在  PHP
关注(0)|答案(9)|浏览(140)

我记得不久前阅读到过关于逻辑运算符的文章,在OR的情况下,使用||or更好(反之亦然)。
我只是不得不在我的项目中使用这个,当它回到我身边时,但我不记得推荐了哪个操作符,或者它是否是真的。
哪个更好,为什么?

c9qzyr3d

c9qzyr3d1#

没有“更好”,但更常见的是||。他们有不同的precedence||会像人们通常期望的那样工作。
另请参阅:Logical operators(* 以下示例取自此处 *):

// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;

// The constant false is assigned to $f and then true is ignored
// Acts like: (($f = false) or true)
$f = false or true;
sulc1iza

sulc1iza2#

它们用于不同的目的,实际上具有不同的运算符优先级。&&||运算符用于布尔条件,而andor用于控制流。
例如,以下是布尔条件:

if ($foo == $bar && $baz != $quxx) {

这与控制流不同:

doSomething() or die();
oxalkeyp

oxalkeyp3#

区别分别||和OR和&&和AND是operator precedence

x1月0n1x日

  • 解释为($bool = (FALSE || TRUE))
  • $bool的值为TRUE

$bool = FALSE OR TRUE;

  • 解释为(($bool = FALSE) OR TRUE)
  • $bool的值为FALSE

$bool = TRUE && FALSE;

  • 解释为($bool = (TRUE && FALSE))
  • $bool的值为FALSE

$bool = TRUE AND FALSE;

  • 解释为(($bool = TRUE) AND FALSE)
  • $bool的值为TRUE
93ze6v8z

93ze6v8z4#

来源:http://wallstreetdeveloper.com/php-logical-operators/
以下是使用逻辑运算符的示例代码:

<html>

<head>
    <title>Logical</title>
</head>

<body>
    <?php
        $a = 10;
        $b = 20;
        if ($a>$b)
        {
            echo " A is Greater";
        }
        elseif ($a<$b)
        {
            echo " A is lesser";
        }
        else
        {
             echo "A and B are equal";
        }
    ?>
    <?php
        $c = 30;
        $d = 40;
        //if (($a<$c) AND ($b<$d))
        if (($a<$c) && ($b<$d))
        {
            echo "A and B are larger";
        }
        if (isset($d))
            $d = 100;
        echo $d;
        unset($d);
    ?>
    <?php
        $var1 = 2;
        switch($var1)
        {
            case 1:  echo "var1 is 1";
                     break;
            case 2:  echo "var1 is 2";
                     break;
            case 3:  echo "var1 is 3";
                     break;
            default: echo "var1 is unknown";
        }
    ?>
</body>
</html>
r8uurelv

r8uurelv5#

我知道这是一个老主题,但仍然。我刚刚遇到的问题,我在工作中调试的代码,也许有人可能有类似的问题...
假设代码如下所示:

$positions = $this->positions() || [];

你可能会认为(就像你习惯于从javascript中看到的那样)当$this-〉positions()返回false或null时,$positions是空数组,但事实并非如此,值是TRUE还是FALSE取决于$this-〉positions()返回的值。
如果你需要得到$this-〉positions()的值或者空数组,你必须用途:

$positions = $this->positions() or [];

编辑:

上面的例子没有按预期工作,但事实是||or并不相同...试试这个:

<?php

function returnEmpty()
{
  //return "string";
  //return [1];
  return null;
}

$first = returnEmpty() || [];
$second = returnEmpty() or [];
$third = returnEmpty() ?: [];

var_dump($first);
var_dump($second);
var_dump($third);
echo "\n";

这就是结果:

bool(false)
NULL
array(0) {
}

所以,当你想设置返回值或空数组时,第三个选项?:是正确的解决方案。

$positions = $this->positions() ?: [];

使用PHP 7.2.1进行测试

vxbzzdmp

vxbzzdmp6#

我并不认为一个本质上比另一个更好,但我建议坚持使用||因为它是大多数语言的默认值。
编辑:正如其他人所指出的,两者确实有区别。

0s0u357o

0s0u357o7#

没有好坏之分,只是取决于运算符的优先级。由于||的优先级高于or,所以||被使用得最多。

hlswsv35

hlswsv358#

来源:https://codedtag.com/php/php-or-operator/

function func( ?string $string = 'null') {
  return strlen($string);
}

var_dump( func(null) || strlen(null) ); // bool(false)
var_dump( strlen(null) || func() ); // bool(true)
x0fgdtte

x0fgdtte9#

一些语言使用short-circuit,而另一些语言使用完全布尔求值(如果您知道,这类似于Pascal中的指令$B)。
说明:

function A(){
    ...Do something..
    return true;
}

function B(){
    ...Do something..
    return true;
}

if ( A() OR B() ) { .....

在本例中,函数B()永远不会被执行。因为函数A()返回TRUE,所以OR语句的结果从第一部分就可以知道,而不必计算表达式的第二部分。
但是,对于( A() || B() ),无论第一部分的值如何,始终计算第二部分。
对于优化的编程,您应该始终使用OR,这样速度更快(第一部分返回false,而第二部分实际上需要求值的情况除外)。

相关问题