PHP si MySql (Programator Web 2)

DOCUMENTATIE CURS

Operatori logici

Definitie
Operatorii logici sunt folositi pentru a opera cu valori boolene iar rezultatul acestor operatori este tot o valoare booleana.


&& SI logic. Rezultatul este true daca ambii operanzi sunt evaluati boolean ca true.
|| SAU logic. Rezultatul este true daca cel putin unul din cei doi operatori este evaluat boolean ca true.
and SI logic. Similar cu && dar cu o prioritate mai mica.
or SAU logic. Similar cu or dar cu o prioritate mai mica
xor SAU exclusiv true daca operanzii sunt diferiti, si false daca operanzii sunt egali.


Alt operator logic este "!". Doar ca are un singur operand, si se aseaza in fata acestui operand. Operatorul inverseaza valoarea booleana a operatorului.

Sursa script Sursa HTML in browser
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$a = true;
$b = !$a; // $b devine false
var_dump($b);
// $b e false. atunci !$b este true
if (!$b) {
  echo 'e adevarat'; 
 }
?>
1
2
bool(false)
e adevarat




Sursa script Sursa HTML in browser
1
2
3
4
5
6
<?php
var_dump(true && false);
var_dump(true && true);
var_dump(true || false);
var_dump(false || true);
?>
1
2
3
4
bool(false)
bool(true)
bool(true)
bool(true)


pot folosi paranteze pentru a dicta ordinea operatiilor.

Sursa script Sursa HTML in browser
1
2
3
4
5
6
7
<?php
$a = false && (false || true);
var_dump($a);
$a = false && false || true;
var_dump($a);
?>
1
2
bool(false)
bool(true)


Nota
Operatorii logici evalueaza operanzii ca valori booleene.


Sursa script Sursa HTML in browser
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
/*
1 este intreg. convertit la boolean este true
0 este intreg. convertit la boolean este false
true || false = true
*/
$a = 1;
$b = 0;
if ($a || $b) {
  echo 'e adevarat'; // e adevarat
 }
echo "\n";
var_dump($a || $b); // bool(true)
/*
a si b au fost convertiti doar in cadrul operatiei logice la boolean. 
ele isi pastreaza insa tipul de date initial 
*/
var_dump($a); // int(1)
var_dump($b); // int(0)
var_dump("" || 0); // sirul "" este evaluat ca false , la fel si 0. output: bool(false)
?>
1
2
3
4
5
e adevarat
bool(true)
int(1)
int(0)
bool(false)


Important
Operatorii &&, and, ||, or, functioneaza cu "scurtcircuitare", adica al doilea operand nu este evaluat daca se poate stabili rezultatul sigur al operatiei logice doar din primul operand. Acest lucru este important atunci cand al doilea operand este de exemplu apelarea unei functii, pentru ca functia poate fi (sau nu) apelata in functie de acest lucru.



Sursa script Sursa HTML in browser
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
function scrie($ceva)
{
  echo $ceva;
  echo "\n";
  return false;
}
/* 
functia scrie() nu este apelata pentru ca primul operator al || (sau logic) este true, 
deci rezultatul operatiei va fi true indiferent de al doilea operand
*/
$a = true || scrie('ceva cu || '); 
// in acest caz, nu se poate stabili rezultatul operatiei doar din primul operand, deci se executa si functia
$a = false || scrie('altceva cu || ');
$a = true or scrie('ceva cu or'); // similar cu primul exemplu
$a = true && scrie('ceva cu &&'); 
?>
1
2
altceva cu || 
ceva cu &&


Diferenta de prioritate intre && si and, si intre || sau or, poate fi importanta in anumite cazuri. Pentru detalii, vezi capitolul din php manual Operators precedence. Un exemplu clasic, este codul: $link = mysql_connect(...) or die('Eroare la conectare'); folosit uneori pentru conectarea la baza de date.

Sursa script Sursa HTML in browser
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
function test($s)
{
  echo $s;
  echo "\n";
  return true;
}
/*
 in ambele cazuri de mai jos se evalueaza si al doilea operand (deci se executa functia test() ) pentru ca 
din punctul de vedere al scurtcircuitarii si al 
operatiilor logice "or" si "||" functioneaza la fel. (precum si "&&" si "and")
diferenta apare insa  intre valoarea lui $a si valoarea lui $b datorita diferentei de prioritate intre operatori
*/
/* se executa intai $a = false (pentru ca operatorul "=" are prioritate mai mare fata de "or"). 
apoi, expresia $a = false luand valoarea false, se face mai departe false or test(1) (rezultat care nu este atribuit nimanui).
*/
$a = false or test(1); 
/*
se executa intai false || test(1) (pentru ca operatorul "||" are prioritatemai mare decat "="). 
rezultatul false || test(1) este true, apoi se face $b = true.
*/
$b = false || test(2); 
var_dump($a);
var_dump($b);
?>
1
2
3
4
1
2
bool(false)
bool(true)


© 2006-2012 Crystal Mind Academy. All rights reserved