Hướng dẫn logical program in php

Logical Operators

ExampleNameResult
$a and $b And true if both $a and $b are true.
$a or $b Or true if either $a or $b is true.
$a xor $b Xor true if either $a or $b is true, but not both.
! $a Not true if $a is not true.
$a && $b And true if both $a and $b are true.
$a || $b Or true if either $a or $b is true.

The reason for the two different variations of "and" and "or" operators is that they operate at different precedences. [See Operator Precedence.]

Example #1 Logical operators illustrated

The above example will output something similar to:

bool[true]
bool[false]
bool[false]
bool[true]

Lawrence

15 years ago

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'];

dumitru at floringabriel dot com

5 years ago

In addition to what Lawrence said about assigning a default value, one can now use the Null Coalescing Operator [PHP 7]. Hence when we want to assign a default value we can write:

$a = [$fruit ?? 'apple'];
//assigns the $fruit variable content to $a if the $fruit variable exists or has a value that is not NULL, or assigns the value 'apple' to $a if the $fruit variable doesn't exists or it contains the NULL value

thisleenobleNOSPAMPLEASE at mac dot com

5 years ago

In order to kind of emulate the way javascript assigns the first non-false value in an expression such as this:

var v = a || b || c || d;

I wrote a little helper method that I put in a function dump library [here presented as a bare function]:



Now instead of:

$v = $a ? $a : $b;

I write:

$v = either[$a, $b];

but more importantly, instead of writing:

$v = $a ? $a : [$b ? $b : $c];

I write:

$v = either[$a, $b, $c];

or indeed:

$v = either[$a, $b, $c, $d, $e, $f, $g, $h];

pepesantillan at gmail dot com

14 years ago

worth reading for people learning about php and programming: [adding extras to get highlighted code]

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

...

_______________________________________________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

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.

egst

1 year ago

In response to Lawrence about || always returning a boolean:

Instead of

$x ? $x : 'fallback'

you can also use the "elvis operator":

$x ?: 'fallback'

which is useful in cases, where the left-hand side of the ternary operator is too long type, is too complex to calculate twice, or has side-effects.

It also combines nicely with the ?? operator, which is equivalent to an empty[] check [both isset[] and `!= false`]:

$x->y ?? null ?: 'fallback';

instead of:

empty[$x->y] ? $x->y : 'fallback'

momrom at freenet dot de

13 years ago

Evaluation of logical expressions is stopped as soon as the result is known.
If you don't want this, you can replace the and-operator by min[] and the or-operator by max[].



This way, values aren't automaticaly converted to boolean like it would be done when using and or or. Therefore, if you aren't sure the values are already boolean, you have to convert them 'by hand':

phpnet at zc dot webhop dot net

9 years ago

This works similar to javascripts short-curcuit assignments and setting defaults. [e.g.  var a = getParm[] || 'a default';]



$a gets assigned $_GET['var'] if there's anything in it or it will fallback to 'a default'
Parentheses are required, otherwise you'll end up with $a being a boolean.

Andrew

15 years ago

>

doesn't work because return is not an expression, it's a statement. if return was a function it'd work fine. :/

brian at zickzickzick dot com

9 years ago

This has been mentioned before, but just in case you missed it:

vasko at tsintsev dot com

5 years ago

Here is something useful for OR [ or any other ] bitwise comparison:

$a = 0;
$b = 1;

printf['$a = %1$04b | $b = %2$04b ...  PROCESSED is: %3$s [ %3$04b ]', $a, $b, [$a | $b]];

Manucyan

4 years ago

So...
A || B   may be different from  B || A

for exemple :

unset[$a];
if [    [$a < 0]   ||   [!isset[$a]]   ]
echo 'Hello!';

//      return error:  "Notice: Undefined variable: a "

unset[$a];
if [    [!isset[$a]]   ||    [$a < 0]  ]
echo 'Hello!';

//      return   'Hello!'

practical example with an age check over 17 years:
if [    [!isset[$age]]   ||    [$age < 17]  ]
$error_age = true;

this example will not display a php error if the age is not entered

mcodingset at outlook dot com

3 years ago

// __forFun ...
// Example Logical `or` operator

$a = true;                  // true|false or something for test :]
$b = "I'm a string result"; // use|test `string` or `object`

if [!$a or !$c = $b] {
    $c = 'Hey';
}

// print result
var_dump[$c]; // "I'm a string result"

Have Fun!

moschris at gmail dot com

6 years ago

Unlike C++ and related languages, side effects in the left operand may NOT be used in the right operand.

e.g. if [$a=1 && $a>0]
will produce an unassigned error if $a has not previously been assigned a value.

4077

7 years ago

Assign a value to a variable if it isn't defined



instead of:


editor's note: In PHP 7 you could use the coalesce operator and do:


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.

Chủ Đề