답변:
"더 나은"것은 없지만 더 일반적인 것은 ||
. 그들은 다른이 우선 순위 와 ||
하나가 일반적으로 기대하는 것처럼 작동합니다.
참조 : 논리 연산자 ( 다음 예제는 여기에서 가져옴 ) :
// 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;
27 or 0
돌아온다 27
.
or
부울 을 반환하는 것이 맞습니다. 우선 순위가 너무 낮아서 가끔 다른 일을하는 것처럼 보입니다 . :) 이후에 발생 하기 때문에 print 27 or 0
인쇄 됩니다. BTW 는 속지 않습니다 – 출력 합니다. 27
or
print 27
echo
echo 27 or 0
1
그들은 다른 목적으로 사용되며 실제로 다른 연산자 우선 순위를 갖습니다. &&
및 ||
반면 연산자는 부울 조건 의도 and
및 or
제어 흐름을위한 것이다.
예를 들어 다음은 부울 조건입니다.
if ($foo == $bar && $baz != $quxx) {
이것은 제어 흐름과 다릅니다.
doSomething() or die();
die()
doSomething()
반환 할 경우 함수가 호출 false
되거나 null
? 만약에 doSomething()
반환 true
또는 아무것도?
doSomething()
부울로 평가됩니다. PHP가 진실 ( true
, 비어 있지 않은 문자열 등)으로 간주하는 값을 반환하면 die()
.
각각의 차이 || 및 OR 및 && 및 AND는 연산자 우선 순위입니다 .
$bool = FALSE || TRUE;
($bool = (FALSE || TRUE))
$bool
ISTRUE
$bool = FALSE OR TRUE;
(($bool = FALSE) OR TRUE)
$bool
ISFALSE
$bool = TRUE && FALSE;
($bool = (TRUE && FALSE))
$bool
ISFALSE
$bool = TRUE AND FALSE;
(($bool = TRUE) AND FALSE)
$bool
ISTRUE
출처 : 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>
나는 그것이 오래된 주제라는 것을 알고 있지만 여전히. 나는 직장에서 디버깅하는 코드에서 문제를 만났으며 누군가 비슷한 문제가있을 수 있습니다 ...
코드가 다음과 같다고 가정 해 보겠습니다.
$positions = $this->positions() || [];
$ 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로 테스트
$positions = $this->positions() ?? [];
당신이 원하는 것입니다.
일부 언어는 단락 회로를 사용하고 다른 언어는 전체 부울 평가를 사용합니다 (알고있는 경우 이것은 $B
Pascal 의 지시문과 유사합니다 ).
설명 :
function A(){
...Do something..
return true;
}
function B(){
...Do something..
return true;
}
if ( A() OR B() ) { .....
이 예에서는 함수 B()
가 실행되지 않습니다. 함수 A()
가 TRUE를 반환 하기 때문에 OR 문의 결과는 표현식의 두 번째 부분을 평가할 필요없이 첫 번째 부분에서 알 수 있습니다.
그러나를 사용 ( A() || B() )
하면 두 번째 부분은 항상 첫 번째 부분의 값에 관계없이 평가됩니다.
최적화 된 프로그래밍을 위해서는 항상 OR
더 빠른 것을 사용해야 합니다 (첫 번째 부분이 반환 false
되고 두 번째 부분이 실제로 평가되어야 하는 경우 제외 ).
||
, B
호출되지 않습니다. 두 연산자는 우선 순위가 다르다는 점을 제외하고 정확히 동일합니다.
$e = true || $x = 'foo'
정의하지 않습니다$x
때문이 아니라 더 높은 우선 순위로 인해 단락의.