PHP
downloads | documentation | faq | getting help | mailing lists | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

文字列演算子> <加算子/減算子
Last updated: Fri, 14 Nov 2008

view this page in

論理演算子

論理演算子
名前 結果
$a and $b 論理積 $a および $b が共に TRUE の場合に TRUE
$a or $b 論理和 $a または $b のどちらかが TRUE の場合に TRUE
$a xor $b 排他的論理和 $a または $b のどちらかが TRUE でかつ両方とも TRUE でない場合に TRUE
! $a 否定 $a が TRUE でない場合 TRUE
$a && $b 論理積 $a および $b が共に TRUE の場合に TRUE
$a || $b 論理和 $a または $b のどちらかが TRUE の場合に TRUE

"and" および "or" 演算子が 2 種類あるのは、演算が行われる際の優先順位が 異なっているためです (演算子の優先順位 を参照ください)。

例1 論理演算子についての説明

<?php

// foo() は決してコールされることはありません。これらの演算子は短絡評価を行うからです。
$a = (false && foo());
$b = (true  || foo());
$c = (false and foo());
$d = (true  or  foo());

// "||" の優先順位は "or" より高くなります
$e false || true// $e に代入されるのは、(false || true) の評価結果、つまり true です
$f false or true// $f には false が代入されます
var_dump($e$f);

// "&&" の優先順位は "and" より高くなります
$g true && false// $g に代入されるのは、(true && false) の評価結果、つまり false です
$h true and false// $h には true が代入されます
var_dump($g$h);
?>

上の例の出力は、たとえば 以下のようになります。

bool(true)
bool(false)
bool(false)
bool(true)


文字列演算子> <加算子/減算子
Last updated: Fri, 14 Nov 2008
 
add a note add a note User Contributed Notes
論理演算子
sandaimespaceman at gmail dot com
11-Sep-2008 08:07
There's one userful way to use the or operator:

<?php
//If the connection was success, "Connected to database" will be shown.
//If the connection was failed, "Unable to connect" will be shown.(NOTE: The @ will hide error messages)
@mysql_connect("localhost", "root", "password") or die("Unable to connect");
echo
"Connected to database";
?>

So you don't need to use if operators to add more lines.
jeffjeffleelee at hotmail dot com
06-Jul-2008 09:30
@zhustar:

I will verify the following:

<?php
$a
= false xor true;
var_dump($a);  // bool(false)

$a = (false xor true);
var_dump($a);  // bool(true)
?>

At first I thought this was some egregious bug, and then I realized that this is merely an issue of operator precedence. English-word boolean operators have relatively low precedence--in fact they take place after assignment. So the first example assigns false to $a, and then does an xor operation on $a and boolean true.
loaded67 at hotmail dot com
12-Jun-2008 10:40
Someone ever noted that C type operators are applicable in php as well?
more like a (bool / boolean) cast...

See:

<?php
ini_set
('display_errors', 1);
ini_set('error_reporting', 8191);// php5

$whatever = NULL;
$Iwaslike = 'WTF!';

if(!!(
$whatever)){
    echo
'$whatever'.PHP_EOL;
}
if(!!(
$Iwaslike)){
    echo
'$Iwaslike'.PHP_EOL;
}
if(!!!(
$whatever)){
    echo
'$whatever'.PHP_EOL;
}
if(!!!(
$Iwaslike)){
    echo
'$Iwaslike'.PHP_EOL;
}
?>
momrom at freenet dot de
12-Jun-2008 07:10
Some examples from the english manual that aren't avaiable in all languages:

Like in C, logical expressions are evaluated
from left to right until the result is known.
foo() will never get called in the following cases.
<?php
$a
= (false && foo());
$b = (true  || foo());
$c = (false and foo());
$d = (true  or  foo());
?>

"||" has a greater precedence than "="
which has a greater one than "or"
<?php
// same as ($e = (false || true)),
// expression is true and $e ist assigned to true
$e = false || true;

// same as (($e = false) or true),
// expression is true but $e is assigned to false
$f = false or true;
?>

"&&" has a greater precedence than "="
which has a greater one than "and"
<?php
// same as ($e = (true || false)),
// expression is false and $e ist assigned to false
$g = true && false;

// same as (($e = true) and false),
// expression is false but $e is assigned to true
$h = true and false;
?>
Benjamin
29-Feb-2008 09:48
Re:Richard

I show $b printing 1 rather than "banana". Here's how I understand what's going on.

<?php
//"||" has a greater precedence than "or"

$a=0 or $a="avocado"; //evaluated as ($a=0) or ($a="avacado")
//Since $a=0 is false, $a="avocado" is evaluated and $a is assigned the string value "avocado".
echo "$a"; //prints "avocado"
var_dump ($a); // string(7) "avocado"

$b=0 || $b="banana"; // evaluated as $b = (0 || $b = "banana")
echo $b; //prints "1"
var_dump ($b); // bool(true)
?>
Richard
30-Jan-2008 06:22
Re Lawrence:

You sort of can do conditional evaluation:

$a=0 or $a="avocado";
echo "$a";                              #Prints "avocado"

But oddly:

$b=0 || $b="banana";
echo $b;                                 #Prints "banana"
zhustar at gmail dot com
17-Jan-2008 07:02
$a = false xor true;
var_dump($a);  // bool(false)

$a = (false xor true);
var_dump($a);  // bool(true)
pepesantillan at gmail dot com
23-Dec-2007 03:23
worth reading for people learning about php and programming: (adding extras <?php ?> to get highlighted code)

about the following example in this page manual:
Example#1 Logical operators illustrated

...
<?php
// "||" has a greater precedence than "or"
$e = false || true; // $e will be assigned to (false || true) which is true
$f = false or true; // $f will be assigned to false
var_dump($e, $f);

// "&&" has a greater precedence than "and"
$g = true && false; // $g will be assigned to (true && false) which is false
$h = true and false; // $h will be assigned to true
var_dump($g, $h);
?>
_______________________________________________end of my quote...

If necessary, I wanted to give further explanation on this and say that when we write:
$f = false or true; // $f will be assigned to false
the explanation:

"||" has a greater precedence than "or"

its true. But a more acurate one would be

"||" has greater precedence than "or" and than "=", whereas "or" doesnt have greater precedence than "=", so

<?php
$f
= false or true;

//is like writting

($f = false ) or true;

//and

$e = false || true;

is the same as

$e = (false || true);

?>

same goes for "&&" and "AND".

If you find it hard to remember operators precedence you can always use parenthesys - "(" and ")". And even if you get to learn it remember that being a good programmer is not showing you can do code with fewer words. The point of being a good programmer is writting code that is easy to understand (comment your code when necessary!), easy to maintain and with high efficiency, among other things.
paranoiq at centrum dot cz
19-Nov-2007 08:00
and, or and xor can be used as conditional constructs:

<?php
// do_that() is executed only if do_this() returns false
if($something) do_this() or do_that();
// $b is assigned to $b, do_that() is executed if $b is false
if($something) $a = $b or do_that();

// do_that() is executed only if do_this() returns true
if($something) do_this() and do_that();
// $b is assigned to $b, do_that() is executed if $b is true
if($something) $a = $b and do_that();

// both do_that() and do_this() are executed..
if($something) do_this() xor do_that();
// .. so the behaviour is same as:
if($something) {
   
do_this();
   
do_that();
}
?>

for understanding what happens if $b is NULL or do_this() returns NULL, read the avbentem's comment on NULL type. generaly speaking, NULL is threated like false in most cases.
peter dot kutak at NOSPAM dot gmail dot com
01-Oct-2007 12:36
$test = true and false;     ---> $test === true
$test = (true and false);  ---> $test === false
$test = true && false;      ---> $test === false
Lawrence
28-Aug-2007 12:04
Note that PHP's boolean operators *always* return a boolean value... as opposed to other languages that return the value of the last evaluated expression.

For example:

$a = 0 || 'avacado';
print "A: $a\n";

will print:

A: 1

in PHP -- as opposed to printing "A: avacado" as it would in a language like Perl or JavaScript.

This means you can't use the '||' operator to set a default value:

$a = $fruit || 'apple';

instead, you have to use the '?:' operator:

$a = ($fruit ? $fruit : 'apple');
Andrew
13-Aug-2007 08:49
> <?php
> your_function() or return "whatever";
>
?>

doesn't work because return is not an expression, it's a statement. if return was a function it'd work fine. :/
looris at gmail dot com
17-Jun-2007 07:46
Please note that while you can do things like:
<?php
your_function
() or die("horribly");
?>

you can't do:
<?php
your_function
() or return "whatever";
?>
(it will give you a syntax error).
eduardofleury at uol dot com dot br
14-Jun-2007 06:16
;;;;;;;;;;;;;;;;;;;;;;;;;
; P1 P2; And; OR  ; XOR ;
;;;;;;;;;;;;;;;;;;;;;;;;;
; V  V ; V  ; V   ; F   ;
; V  F ; F  ; V   ; V   ;
; F  V ; F  ; V   ; V   ;
; F  F ; F  ; F   ; F   ;
;;;;;;;;;;;;;;;;;;;;;;;;;

<?php

$a
= 2;
$b = 3;
$c = 6;

print !(
$a > $b && $b < $c);// true

print (($a > $b) and ($b < $c));// false

print ($a == $b or $b < $c); // true

print $a == $b || $b < $c; // true

$x = $a < $b; //$x = true

$y = $b === $c; //$y = false

print  $x xor $y; // true

?>

文字列演算子> <加算子/減算子
Last updated: Fri, 14 Nov 2008
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites