Declarații condiționale. Operatori logici în PHP Operații logice într-o stare

PHP acceptă operatorii logici standard AND și &&, SAU și || , ! (nu) și XOR . Operatorii logici vă permit să comparați rezultatele a doi operanzi (o valoare sau o expresie) pentru a determina dacă unul sau ambii returnează adevărat sau fals și să alegeți dacă doriți să continuați executarea scriptului în funcție de valoarea returnată. La fel ca operatorii de comparație, operatorii logici returnează o singură valoare booleană - adevărată sau falsă, în funcție de valorile de ambele părți ale operatorului.

SAU logic (SAU și ||)

Operatorul logic SAU este notat ca SAU sau || . Efectuează o operație OR logică pe doi operanzi. Dacă unul sau ambii operanzi sunt adevărati, returnează adevărat. Dacă ambii operanzi sunt false, returnează false. Probabil ai o întrebare: de ce au făcut două versiuni ale unui operator? Ideea celor două variante diferite ale operatorului SAU logic este că acestea operează cu priorități diferite.

Mai întâi, să vedem cum funcționează operatorul ||. . Și astfel, dacă unul sau ambii operanzi ai săi sunt adevărati, returnează true . Dacă ambii operanzi returnează valori false, va returna false .

Operatorul SAU funcționează la fel ca operatorul ||. cu o singură excepție, dacă operatorul OR este folosit cu o atribuire, va evalua mai întâi și va returna valoarea operandului din stânga, altfel funcționează exact la fel ca operatorul ||. , adică dacă unul sau ambii operanzi ai săi sunt adevărati, returnează true . Dacă ambii operanzi returnează false, va returna false .

Pentru a clarifica modul în care funcționează, să dăm următorul exemplu:

1 // Mai întâi variabilei i se atribuie valoarea false, iar apoi se evaluează al doilea operand // Acțiune prioritară: ($var2 = false) sau adevărat $var2 = fals sau adevărat; echo $var2; // false nu este tipărit // ($var3 = 0) sau 3 $var3 = 0 sau 3; ecou"
$var3"; // => 0 ?>

Orice comparație și operatori logici pot fi combinați în structuri mai complexe:

Mai există un punct important care merită menționat atât în ​​ceea ce privește operatorii OR, cât și ||. . Operatorul logic OR își începe evaluarea cu operandul său din stânga; dacă returnează adevărat, atunci operandul din dreapta nu va fi evaluat. Acest lucru economisește timp de execuție, dar trebuie avut grijă să se asigure că codul de care poate depinde funcționarea corectă a programului nu este plasat în operandul din dreapta.

ȘI logic (ȘI și &&)

Operatorul logic AND este notat cu AND sau && . Efectuează o operație AND logică pe doi operanzi. Returnează adevărat dacă și numai dacă ambii operanzi se evaluează la adevărat. Dacă unul sau ambii operanzi returnează false , operatorul returnează false . Semnificația celor două versiuni diferite ale operatorului „ȘI logic” este aceeași cu a celor doi operatori anteriori, și anume că aceștia lucrează cu priorități diferite.

Mai întâi, să vedem cum funcționează operatorul &&. Și astfel, dacă ambii operanzi ai săi sunt adevărati, returnează true . Dacă cel puțin unul sau ambii operanzi ai săi returnează false , va returna și false .

Operatorul AND funcționează la fel ca și operatorul && cu o excepție, dacă operatorul AND este utilizat cu o atribuire, va evalua mai întâi și va returna valoarea operandului din stânga, altfel funcționează exact la fel ca și operatorul &&. Dacă cel puțin unul dintre operanzii săi returnează false, va returna și false, iar dacă ambii operanzi returnează false, va returna false.

Pentru a înțelege, să ne uităm acum la cum funcționează acest lucru în practică:

$bar3"; // => 9 ?>

SAU exclusiv (XOR)

Operatorul SAU exclusiv este notat XOR. Returnează adevărat dacă unul și numai unul dintre operanzii săi este adevărat. Dacă ambii operanzi sunt adevărati, operatorul va returna false.

Deoarece operatorul XOR are aceeași prioritate ca și operatorii AND și SAU (mai mic decât operatorul de atribuire) și este utilizat într-o expresie de atribuire, mai întâi evaluează și returnează valoarea operandului din stânga.

6 $a1 = 19 xor 5 > 6; var_dump($a1); // => 19 var_dump(true xor true); // false var_dump((2< 3) xor (5 != 5)); // true ?>

NU logic (!)

Operatorul logic NOT, numit și negație, este indicat prin semn! . Este un operator unar plasat înaintea unui singur operand. Operatorul logic NOT este folosit pentru a inversa valoarea logică a operandului său și returnează întotdeauna adevărat sau fals.

Dacă trebuie să inversați valoarea unei expresii, cum ar fi a && b , va trebui să utilizați paranteze: !(a && b) . Tot cu ajutorul unui operator! Puteți converti orice valoare x în echivalentul său boolean folosind operatorul: !!x de două ori.

Ultima actualizare: 1/11/2015

În PHP putem folosi diverși operatori: aritmetici, logici etc. Să ne uităm la fiecare tip de operație.

Operatii aritmetice

    + (operație de adăugare)

    De exemplu, $a + 5

    - (operație de scădere)

    De exemplu, $a - 5

    * (înmulțire)

    De exemplu, $a * 5

    / (Divizia)

    De exemplu, $a / 5

    % (obținerea restului de diviziune)

    De exemplu: $a=12; echo $a % 5; // este egal cu 2

    ++ (creștere/creștere valoarea cu unu)

    De exemplu, ++$a

    Este important să înțelegeți diferența dintre expresiile ++$a și $a++ . De exemplu:

    $a=12; $b=++$a; // $b este egal cu 13 echo $b;

    Aici, mai întâi, se adaugă unul la valoarea variabilei $a, iar apoi valoarea acesteia este echivalată cu variabila $b. Ar fi diferit dacă expresia ar arăta astfel: $b=$a++; . Aici, mai întâi valoarea variabilei $a a fost egală cu variabila $b, iar apoi valoarea variabilei $a a fost mărită.

    -- (scăderea/scăderea valorii cu unu)

    De exemplu, --$a . Și, de asemenea, ca și în cazul incrementului, există două tipuri de înregistrare: --$a și $a--

Operatori de atribuire

    Echivalează o variabilă cu o anumită valoare: $a = 5

    Adăugarea urmată de atribuirea rezultatului. De exemplu: $a=12; $a += 5; eco $a; // egal cu 17

    Scăderea urmată de atribuirea rezultatului. De exemplu: $a=12; $a -= 5; eco $a; // este egal cu 7

    Înmulțirea urmată de atribuirea rezultatului: $a=12; $a *= 5; eco $a; // este egal cu 60

    Împărțirea urmată de atribuirea rezultatului: $a=12; $a /= 5; eco $a; // egal cu 2,4

    Concatenați rândurile și atribuiți rezultatul. Se aplică la două linii. Dacă variabilele nu stochează șiruri, ci, de exemplu, numere, atunci valorile lor sunt convertite în șiruri și apoi se efectuează operația: $a=12; $a .= 5; eco $a; // egal cu 125 // identic cu $b="12"; $b .="5"; // egal cu 125

    Obținerea restului de împărțire și apoi atribuirea rezultatului: $a=12; $a %= 5; eco $a; // este egal cu 2

Operații de comparație

Operațiile de comparare sunt de obicei utilizate în structurile condiționate atunci când este necesar să se compare două valori și, în funcție de rezultatul comparației, să se efectueze anumite acțiuni. Următoarele operațiuni de comparare sunt disponibile.

    Operatorul de egalitate compară două valori și, dacă sunt egale, returnează adevărat, în caz contrar returnează fals: $a == 5

    Operatorul de identitate compară, de asemenea, două valori și, dacă sunt egale, returnează true, în caz contrar returnează false: $a === 5

    Compară două valori și, dacă nu sunt egale, returnează adevărat, în caz contrar returnează false: $a != 5

    Compară două valori și, dacă nu sunt egale, returnează adevărat, în caz contrar returnează false: $a !== 5

    Compară două valori, iar dacă prima este mai mare decât a doua, returnează adevărat, în caz contrar returnează false: $a > 5

    Compară două valori, iar dacă prima este mai mică decât a doua, returnează adevărat, în caz contrar returnează false: $a< 5

    Compară două valori, iar dacă prima este mai mare sau egală cu a doua, returnează adevărat, în caz contrar returnează false: $a >= 5

    Compară două valori, iar dacă prima este mai mică sau egală cu a doua, returnează adevărat, în caz contrar returnează false: $a<= 5

Operator de egalitate și identitate

Ambii operatori compară două expresii și returnează adevărat dacă expresiile sunt egale. Dar există diferențe între ele. Dacă operația de egalitate ia două valori de tipuri diferite, atunci acestea sunt reduse la una - cea pe care interpretul o consideră optimă. De exemplu:

Evident, variabilele stochează valori diferite de diferite tipuri. Dar când sunt comparate, acestea vor fi reduse la același tip - numeric. Iar variabila $a va fi redusă la numărul 22. Și în final, ambele variabile vor fi egale.

Sau, de exemplu, următoarele variabile vor fi, de asemenea, egale:

$a = fals; $b = 0;

Pentru a evita astfel de situații, se folosește operația de echivalență, care ia în considerare nu numai valoarea, ci și tipul variabilei:

$a = "22a"; $b = 22; if($a===$b) echo "egal"; else ecou "nu este egal";

Acum variabilele nu vor fi egale.

Operatorii de inegalitate != și !== funcționează în mod similar.

Operații logice

Operațiile logice sunt de obicei folosite pentru a combina rezultatele a două operații de comparare. De exemplu, trebuie să efectuăm o anumită acțiune dacă mai multe condiții sunt adevărate. Sunt disponibile următoarele operații logice:

    Returnează adevărat dacă ambele comparații returnează adevărat, în caz contrar returnează false: $a == 5 && $b = 6

    Similar cu operația &&: $a == 5 și $b > 6

    Returnează adevărat dacă cel puțin o operație de comparare returnează adevărat, în caz contrar returnează false: $a == 5 || $b = 6

    Similar cu operațiunea || : $a< 5 or $b > 6

    Returnează adevărat dacă operația de comparare returnează false: !($a >= 5)

    Returnează adevărat dacă doar una dintre valori este adevărată. Dacă ambele sunt adevărate sau niciunul nu este adevărat, returnează false. De exemplu: $a=12; $b=6; if($a xor $b) echo "true"; else ecou "fals";

    Aici rezultatul operației logice va fi fals deoarece ambele variabile au o anumită valoare. Hai sa schimbam codul:

    $a=12; $b=NULL; if($a xor $b) echo "true"; else ecou "fals";

    Aici rezultatul va fi deja adevărat, deoarece valoarea unei variabile nu este setată. Dacă o variabilă are valoarea NULL, atunci în operațiile logice valoarea acesteia va fi tratată ca falsă

Operații cu biți

Operațiile cu biți sunt efectuate pe biți individuali ai unui număr. Numerele sunt considerate în reprezentare binară, de exemplu, 2 în reprezentare binară este 010, numărul 7 este 111.

    & (înmulțire logică)

    Înmulțirea se face pe biți, iar dacă ambii operanzi au valori de biți egale cu 1, atunci operația returnează 1, în caz contrar se returnează numărul 0. De exemplu: $a1 = 4; //100 $b1 = 5; //101 echo $a1 & $b1; // este egal cu 4

    Aici numărul 4 în sistemul binar este 100, iar numărul 5 este 101. Înmulțiți numerele pe biți și obțineți (1*1, 0*0, 0 *1) = 100, adică numărul 4 în format zecimal.

    | (adăugare logică)

    Similar înmulțirii logice, operația se efectuează și pe cifre binare, dar acum se returnează una dacă cel puțin un număr dintr-o cifră dată are unul. De exemplu: $a1 = 4; //100 $b1 = 5; //101 echo $a1 | $b1; // este egal cu 5

    ~ (negație logică)

    inversează toți biții: dacă valoarea biților este 1, atunci devine zero și invers. $b = 5; ecou ~$b;

    X<

    x>>y - mută numărul x la dreapta cu y cifre. De exemplu, 16>>1 mută 16 (care este 10000 în binar) cu un loc la dreapta, rezultând 1000 sau 8 în zecimală

Concatenarea șirurilor

Operatorul punct este folosit pentru a concatena șiruri. De exemplu, să conectăm mai multe linii:

$a="Bună ziua,"; $b=" lume"; eco $a . $b . „!”;

Dacă variabilele reprezintă alte tipuri decât șiruri, cum ar fi numere, atunci valorile lor sunt convertite în șiruri și apoi are loc și operația de concatenare a șirurilor.

Lecția va acoperi instrucțiuni php condiționale: instrucțiunea if și instrucțiunea switch

Instrucțiunile condiționale PHP sunt reprezentate de trei constructe principale:

  • operator de condiție dacă,
  • operator comutator intrerupator
  • Și operator ternar.

Să aruncăm o privire mai atentă la fiecare dintre ele.

PHP if declarație

Figura 3.1. Declarație IF condiționată, versiune scurtă


Orez. 3.2. IF ELSE Sintaxa instrucțiunii condiționale


Orez. 3.3. Sintaxa completă a instrucțiunii condiționale IF elseif

Să rezumăm:

Sintaxă completă:

if (condiție) ( // dacă condiția este adevărată operator1; operator2; ) elseif(condiție) ( operator1; ... ) else ( // dacă condiția este falsă operator1; operator2; )

  • Sintaxa scurtată poate nu conțin părți ale clauzei else și nu conțin o condiție suplimentară elseif
  • În loc de cuvântul funcție elseif, puteți scrie elseif (separat)
  • Pot exista mai multe elseifs într-un singur construct. Va fi executată prima expresie elseif egală cu TRUE.
  • Dacă există o condiție alternativă elseif, clauza else trebuie să fie ultima în sintaxă.

O declarație condiționată poate folosi două puncte: în loc de acolade. În acest caz, afirmația se termină cu cuvântul auxiliar endif

Orez. 3.4. Instrucțiunea condiționată If și Endif în php

Exemplu:

if($x > $y): echo $x." este mai mare decât ".$y; elseif($x == $y): // când folosiți „:” nu puteți scrie separat altfel dacă echo $x.” este egal cu „.$y; else: echo $x." not > and not = ".$y; endif;

Important: Când folosiți două puncte în loc de bretele într-o construcție, elseif nu poate fi scris în două cuvinte!

Operații logice într-o stare

Condiția if din paranteze poate conține următoarele operații:

Exemplu: verificați valoarea unei variabile numerice: dacă este mai mică sau egală cu 10, afișați un mesaj „un număr mai mic sau egal cu 10”, altfel afișați un mesaj „un număr mai mare de 10”


Soluţie:

$numar=15; dacă ($număr<=10) { echo "число меньше или равно 10"; } else { echo "число больше 10"; }

Blocurile de cod PHP pot fi sparte, să ne uităm la un exemplu:

Exemplu: Afișează codul html pe ecran "a este egal cu 4", dacă variabila $a este într-adevăr egală cu 4


1 Soluție:
1 2 3 4

2 Soluție:

1 2 3 A este egal cu 4

A este egal cu 4

php job 3_1: Afișați traducerea culorilor din engleză în rusă, verificând valoarea variabilei (în care este atribuită culoarea: $a="blue")


php job 3_2: Găsiți maximum trei numere

Operații de comparație și regula minciunii

Construcția if între paranteze trebuie să conțină o expresie logică sau o variabilă, care este considerată din punctul de vedere al algebrei logicii, returnând valorile fie adevărate, fie false.

Acestea. o singură variabilă poate acționa ca o condiție. Să ne uităm la un exemplu:

1 2 3 4 $a = 1 ; dacă ($a) ( ecou $a; )

$a=1; dacă ($a) ( ecou $a; )

În exemplu, traducătorul limbajului PHP va considera variabila dintre paranteze ca fiind o regulă de minciună:

Regula minciunii sau ceea ce este considerat fals:

  • logic Fals
  • zero întreg ( 0 )
  • zero real ( 0.0 )
  • linie goalăși sfoară «0»
  • matrice fără elemente
  • obiect fără variabile
  • tip special NUL

Astfel, în exemplul considerat, variabila $a este egală cu unu, în consecință condiția va fi adevărată și operatorul echo $a; va afișa valoarea variabilei.

php job 3_3: este dată o variabilă a cu o valoare șir. Dacă a este egal cu numele, imprimați "Bună, nume!", dacă a este egal cu o valoare goală, atunci ieșire "Bună străină!"

Construcții logice ȘI SAU și NU în operatorul condiționat

  1. Uneori este necesar să se prevadă îndeplinirea mai multor condiții simultan. Apoi condițiile sunt combinate operator logic AND — && :
  2. $a=1; dacă ($a>0 || $a>1) ( echo "a > 0 sau a > 1"; )

  3. Pentru a indica dacă o condiție este falsă, utilizați operator logic NU — ! :
  4. 1 2 3 4 $a = 1 ; dacă (! ($a< 0 ) ) { echo "a не < 0" ; }

    $a=1; dacă (!($a<0)) { echo "a не < 0"; }

Comutați operatorul PHP

Operatorul comutator sau „comutator” înlocuiește mai multe constructe if consecutive. Procedând astfel, compară o variabilă cu mai multe valori. Astfel, acesta este cel mai convenabil mijloc pentru organizarea multi-ramurilor.

Sintaxă:

1 2 3 4 5 6 7 8 9 10 comutator ($variabilă) (case "valoare1": operator1; pauză; caz "valoare2": operator2; pauză; caz "valoare3": operator3; pauză; [ implicit: operator4; pauză ; ] )

comutați($variabilă)( cazul „valoare1”: operator1; pauză; caz „valoare2”: operator2; pauză; caz „valoare3”: operator3; pauză; )

  • Operatorul poate verifica atât valorile șirurilor (apoi sunt specificate între ghilimele), cât și valorile numerice (fără ghilimele).
  • Declarația de pauză în construcție este necesară. Iese din construct dacă condiția este adevărată și este executat operatorul corespunzător condiției. Fără pauză, toate declarațiile de caz vor fi executate indiferent de adevărul lor.

Orez. 3.5. Declarație de comutare condiționată


Exemplu: este dat o matrice cu nume complete masculine. Verificați primul element al matricei și, în funcție de nume, afișați un salut cu un nume scurt.


Soluţie:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $nume = matrice ("Ivan" , "Peter" , "Semyon" ); comutare ($names [ 0 ] ) ( case „Peter” : ecou „Bună ziua, Petya!” ; break ; case „Ivan” : ecou „Hello, Vanya!” ; break ; case „Semyon” : ecou „Hi, Vanya! " ; pauză ; implicit: echo "Bună, $nume!"; pauză ; )

$nume=matrice("Ivan","Peter","Semyon"); comutare($nume)( caz „Peter”: ecou „Bună, Petya!”; pauză; caz „Ivan”: ecou „Bună, Vanya!”; pauză; caz „Semyon”: ecou „Buna, Vanya!”; pauză ; implicit: echo „Bună ziua, $nume!”; pauză; )

php job 3_4:

  • Creați o variabilă $day și atribuiți-i o valoare numerică arbitrară
  • Folosind constructia switch, tipăriți fraza „Este o zi de lucru”, dacă valoarea variabilei $day se încadrează în intervalul de numere de la 1 la 5 (inclusiv)
  • Tipăriți fraza „Este o zi liberă”, dacă valoarea variabilei $day este egală cu numerele 6 sau 7
  • Tipăriți fraza „Ziu necunoscută”, dacă valoarea variabilei $day nu se încadrează în intervalul de numere de la 1 la 7 (inclusiv)

Completează codul:

1 2 3 4 5 6 7 8 9 10 11 12 ... comutator (... ) ( cazul 1 : cazul 2 : ... ecou „Este o zi de lucru”; pauză ; cazul 6 : ... implicit : ... )

Comutare(...)( cazul 1: cazul 2: ... ecou „Este o zi lucrătoare”; pauză; cazul 6: ... implicit: ... )

Operator ternar PHP

Operator ternar, adică cu trei operanzi, are o sintaxă destul de simplă în care la stânga lui ? se scrie conditia, iar in dreapta sunt doi operatori despartiti prin semn: , in stanga semnului operatorul se executa daca conditia este adevarata, iar in dreapta semnului: operatorul se executa daca conditia este fals.

condiție? operator1 : operator2 ;

PHP acceptă următorul standard operatori logici: „ȘI” și „&&” (ȘI logic), „SAU” și „||” (SAU logic), "!" (NU logic) și „XOR” (SAU exclusiv). Toate sunt folosite în expresii logice pentru a determina unul sau altul curs de execuție a programului în funcție de rezultatul returnat de expresie și se referă la operatori binari, cu excepția operatorului "!" , care este unară. Când se utilizează operatori logici, operanzii acestora sunt convertiți la tipul de date boolean (), iar rezultatul depinde de valorile logice date ale operanzilor și de tipul de operator logic (a se vedea tabelul nr. 1).

Tabelul nr. 1. Operatori logici

Diferența dintre operatorii „ȘI” și „&&” și „SAU” și „||” este că operatorii „ȘI”, „SAU” și „XOR” au o prioritate mai mică, care este chiar mai mică decât operatorii de atribuire (vezi tabelul operator PHP).

Este important să înțelegeți modul în care interpretul procesează expresiile booleene. Dacă într-o expresie cu operatorul „||” primul operand (stânga) va avea valoarea true sau într-o expresie cu operatorul „&&” primul operand va avea valoarea false , apoi al doilea operand (dreapta) nu va mai fi calculat. Acest lucru se datorează faptului că rezultatul final în astfel de cazuri nu se va schimba (a se vedea tabelul nr. 1) și, prin urmare, nu este nevoie să petreceți timp procesând codul celui de-al doilea operand. Cu toate acestea, trebuie să aveți grijă să nu plasați codul în operandul potrivit de care poate depinde funcționarea corectă a programului.

Utilizarea operatorilor logici este prezentată în exemplul nr. 2.

fals $a=0||fals; //Acum $a==adevărat, pentru că 5->adevărat și 8->adevărat $a=5& //Acum $a==fals, deoarece "0"->false $a="0"& //Acum $a==true $a=!false; //Acum $a==false, deoarece 5->adevarat $a=!5; /* Funcția foo() nu va fi apelată din cauza shunturilor */ $a=(false&&foo()); $b=(adevărat||foo()); $c=(fals și foo()); $d=(adevărat sau foo()); /* Diferența „||” din „sau” și „&&” din „și” */ //Acţionează ca ($a=(fals||adevărat)) $a=fals||adevărat; //Acţionează ca (($a=fals) sau adevărat) $a=fals sau adevărat; //Acţionează ca ($a=(fals&&adevărat)) $a=fals& //Acţionează ca (($a=fals) şi adevărat) $a=fals şi adevărat; //Acum $a==5, acționează ca (($a=5) xor 0) $a=5 xor 0; //Acum $a==5, acționează ca (($a=5) și 0) $a=5 și 0; //Acum $a==5, acționează ca (($a=5) sau 0) $a=5 sau 0; //Acum $a==adevărat, acționează ca ($a=(5||0)) $a=5||0; //Acum $a==fals, acționează ca ($a=(5&&0)) $a=5& //Acum $a==adevărat, acționează ca ($a=(5 xor 6)) $a=(5 xor 6); ?>

Exemplul nr. 2. Utilizarea operatorilor booleeni

>> Am citit câteva dintre aceste răspunsuri și, sincer, nu am găsit unul care să explice diferențele dintre operatorii „||” și „SAU”.

Diferența este explicată în linkul către prioritatea operatorului.

„ ||” operatorii sunt evaluați înainte de atribuire ("="), în timp ce operatorii "sau" sunt evaluați după atribuire. În cel de-al doilea exemplu, îi spuneți PHP să atribuie mai întâi rezultatul „(choice1 != false ? „hah” : „boo”)” lui $val, apoi „sau” împotriva restului declarației. Încercați exemplul de mai jos și veți vedea ce vreau să spun (rețineți parantezele suplimentare pentru a impune prioritate):

define („alegerea1” , fals );
definesc („alegerea2”, „câine”);
define („implicit1”, „altul”);
$val = matrice();

$val [ "Test 1" ] = (alegere1 != fals ? "hah" : "boo" ) || (choice2 != false ? "hah2" : "boo2" ) || (implicit1 != false ? "hah3" : "boo3" );
$val [ "Testul 1b" ] = ((alegerea1 != fals ? "hah" : "boo" ) || (alegerea2 != fals ? "hah2" : "boo2" ) || (implicit1 != fals ? "hah3" " : "boo3" ));
$val [ "Testul 2" ] = (alegere1 != fals ? "hah" : "boo" ) sau (alegere2 != fals ? "hah2" : "boo2" ) sau (implicit1 != fals ? "hah3" : " boo3");
$val [ "Test 2b" ] = ((alegerea1 != fals ? "hah" : "boo" ) sau (alegere2 != fals ? "hah2" : "boo2" ) sau (implicit1 != fals ? "hah3" : "boo3" ));

Foreach ($val ca $test => $rezultat) (
print("$test: "); var_dump ($rezultat); imprimare "
\n
\n" ;
}
?>

test la hto dot com

Deoarece prescurtarea OR pentru un bloc if poate produce mai mult
cod citibil cu mai puțină tastare, este tentant să se producă funcții care vor returna FALSE la eșec sau un alt tip de date la succes. La fel ca mysql_connect, care „returnează un identificator de legătură MySQL la succes sau FALSE la eșec”.

Dezvoltatorul php php începător ar trebui să evite crearea de funcții care ar putea produce un FALSE la eșec și un întreg la succes, dacă există vreo șansă ca întregul să fie zero.

bla bla bla ;
$i = da-mi_libertate () sau die("EROARE FATAL DB!" );
bla bla bla ;
?>

ironmo67 la yahoo dot com

Am descoperit o diferență oarecum enervantă între PHP și Perl:


if (! some_function ()) returnează false ;
?>

nu poate fi rescris ca fiind cel mai frumos:

function some_function ()( returneaza fals ; )
some_function () sau returnează false ;
?>

Următoarele vor funcționa însă:

function some_function ()( returneaza fals ; )
some_function() sau die();
?>

Poți ghici de ce? Pur și simplu, die() este o funcție, iar „return” este o declarație (cum ar fi diferența dintre print() și echo). Acest lucru este foarte rău pentru că mi se pare că versiunea if(!)() este obosită și imposibil de citit, dar hei, este mai bună decât if (some_c_function == 0) (fă ceva).

O mare parte din discuția de mai jos ar fi putut fi evitată pur și simplu clarând că &, | și ^ sunt *nu* operatori logici. De aceea nu sunt enumerate pe această pagină. Sunt operatori care acționează asupra reprezentărilor binare ale numerelor. Ei nu iau valori logice (adică „adevărat” sau „fals”) ca argumente fără a le converti mai întâi în numerele 1 și respectiv 0. Nici nu returnează. valori logice, dar numere. Sigur, puteți trata ulterior acele numere ca și cum ar fi valori logice (caz în care 0 este transformat în „fals” și orice altceva este transformat în „adevărat”), dar aceasta este o consecință a Regulile de turnare de tip PHP și nimic de-a face cu comportamentul operatorilor.

Dacă doriți operații logice, utilizați operatori logici; dacă doriți operații pe biți, utilizați operatori pe biți... folosirea unuia pentru celălalt pare o modalitate bună de a îngreuna lucrurile.

kws_ la hotpop dot com

„Doar pentru că poți, nu înseamnă că ar trebui.”

De asemenea, simt că eludarea evaluării scurt-circuitului și bazarea pe efectele secundare în expresiile condiționate înseamnă un stil prost. Scrierea unui cod care se documentează folosind constructe clare și directe mi se pare o practică mult mai bună decât folosirea unei expresii complicate și greu de citit și explicarea cu comentarii (sau, mai rău încă, fără documentarea deloc!). Într-adevăr, codul sursă ar trebui să fie scris pentru ochii programatorului mai mult decât pentru ochii computerului.

Utilizarea operatorilor pe biți într-un context logic ar putea încălca așteptările cititorului și poate crea confuzie deoarece operatorii pe biți implică operanzi pe câmp de biți.

De asemenea, simt că asumarea că evaluarea scurtcircuitului este cea mai bună pentru constructele logice ESTE în „drepturile” compilatorului, deoarece atunci când operatorii logici sunt utilizați în scopul lor, ipotezele că scurtcircuitarea face ca *SUNT* logice și nu (din nou, atunci când este folosit corect) optimizați evaluarea expresiilor logice.

Nu intenția mea este să aprind sau să insult în mod direct pe orice individ, ci doar să descurajez folosirea unui stil slab și să încurajez programatorii noi (și chiar unii cu experiență) să scrie cod clar și pronunțat și să se gândească la programatori, mai degrabă decât la computere care ar putea ajunge să încerce să-ți descifreze creațiile.

Ca răspuns la braintreno:

Al doilea exemplu pe care l-ai adus este modul corect de a face asta! Nu este deloc o logică încurcată, este ceea ce face codul tău ușor de citit, prin faptul că nu te bazezi pe efecte secundare obscure!! Este mult mai ușor de citit decât primul și este mult mai ușor de întreținut.

Pentru ideea de a lăsa o funcție CheckThisOrOther() să ecou informații numai pentru utilizator, ar trebui să fiți dezbrăcat de licența de codare. Dacă ar trebui vreodată să păstrez unul dintre scenariile tale, ar trebui să te urăsc.

Acest lucru nu este atât de aprins pe cât ar putea suna! Codul sursă nu este scris pentru ca computere să-l execute, ci pentru ca codori să-l citească! Păstrează asta la inimă și colegii tăi îți vor mulțumi pentru asta!

braintrino

Postarea lui Shadedecho de a forța evaluarea ambelor expresii SAU este de fapt exact ceea ce ar trebui făcut pentru a suprima optimizarea scurtcircuitului.

Sunt multe ocazii în care nu doriți ca compilatorul să scurtcircuiteze orice evaluare, mai ales când doriți să faceți o situație și/sau. Evaluarea scurtcircuitului face o operație SAU, dar nu o operație SI/SAU!!!

De exemplu, dacă vreau să verific formularul de interogare al utilizatorului pentru a vedea dacă utilizatorul a ratat răspunsul la vreo intrare ȘI/SAU dacă utilizatorul a duplicat același răspuns pentru mai multe intrări, atunci trebuie să trimit formularul înapoi clientului informând ceea ce vreau să fie corectat.

Funcția SomeAnswersAreMissing()
{
...
echo „Hopa! Ai ratat să răspunzi la câteva întrebări.”;
returnează TRUE;
}

Funcția SomeAnswersAreDuplicated()
{
...
echo „Hopa! Puteți răspunde la ambele în același mod.”;
returnează TRUE;
}

Dacă (Lipsesc unele răspunsuri() || SomeAnswersAreDuplicated())
SendFormAgain();

Dacă fac asta, utilizatorul va vedea doar avertismentul de răspuns lipsă, dar nu și avertismentul de răspuns duplicat, chiar dacă ambele sunt adevărate. Acest lucru nu este informativ pentru utilizator, deoarece el/ea va trebui să trimită din nou formularul de două ori înainte să-și dea seama de tot ce a făcut greșit și să frustreze hack-ul din ei. Nu este ușor de utilizat.

Dacă (Lipsesc unele răspunsuri() | SomeAnswersAreDuplicated())
SendFormAgain();

Apoi ambele mesaje de avertizare sunt trimise în același timp, iar utilizatorul le poate corecta într-o singură retrimitere.

Mulțumesc lui shadedecho, am căutat o modalitate de a anula optimizarea stupidă de scurtcircuit a compilatorului. Computerul nu poate să presupună că scurtcircuitarea este cea mai bună:(

BTW, desigur că poți face:

$tu_ai facut_o_greala = false;

Dacă(Lipsesc unele răspunsuri())

dacă (SomeAnswersAreDuplicated())
$tu_ai facut_o_greala = adevarat;

Dacă ($ai făcut_o_greșeală)
SendFormAgain();

Dar asta e o logica complicata!!!

hop

Dragă începător,

(deoarece nu văd astfel de idei care apar în mintea programatorilor cu experiență...)

Vă rugăm să nu acordați atenție postării lui shadedecho din 14-mar-2003 04:02! El se bazează foarte mult pe efecte secundare obscure, ceea ce nu este doar o practică de programare foarte proastă, dar nici nu realizează optimizarea pe care crede că este.

Modul corect de a face acest lucru


eco $a;
}

Lucrul așa cum dorește shadedecho este (deși exemplul în ansamblu este destul de inadecvat):

$a .= bla();
$a .= blah2();

Dacă ($a) ( ecou $a; )

Dacă citiți discuția către care vă trimite, veți descoperi că își dorea cu adevărat să obțină toate intrările distincte din două tabele db diferite. Chiar și acolo se înșală. Modul corect de a face acest lucru este să procesați primul tabel și apoi să procesați al doilea tabel.
Aceasta nu numai că este mult mai lizibilă decât soluția cu „|”, dar nu este deloc mai lent.

shadedecho

Se pare (după multe căutări și discuții frustrante, dar în cele din urmă utile pe forumuri precum tek-tips) că
|| iar && sunt „scurtcircuitate” după cum sa observat anterior, DAR | și operatorii & (documentați de PHP ca operatori pe biți) se comportă ca contrapartidele lor nescurtcircuitate, respectiv.

Funcția bla () (
ecou „bună ziua< br>";
intoarce "de la bla ()< br>";
}

Funcția blah2() (
ecou "lume\< br>";
întoarcere "de la blah2()< br>";
}

Dacă (($a .= blah()) || ($a .= blah2())) (
eco $a;
}

Acest lucru ar avea ca rezultat următorul rezultat:

Buna ziua
din bla ()

Observați că „lumea” „nu a primit ecou”d și „de la blah2()” „nu a primit concat”d în variabila $a, deoarece prima atribuire către $a a avut succes, deci „scurtcircutarea” începe și testul boolean se termină fără a evalua restul.

CU toate acestea, dacă înlocuiți || cu doar | în acea instrucțiune „dacă”, obțineți rezultatul:

Buna ziua
lume
din bla ()
din blah2()

Eureka! toate părțile testului boolean sunt evaluate, în modul așteptat de la stânga la dreapta și urmând toate regulile normale de precedență, din câte văd.

Acest lucru are sens total... Folosind operatorii pe biți, ceea ce are loc este operația la nivel pe biți pe rezultatul a două operații non-biți (atribuțiile). Dacă o operație non-bit returnează null (cu alte cuvinte, valoarea atribuită se dovedește a fi nulă sau 0), operatorul pe biți s-ar lega de aceasta (sau mai potrivit, l-ar „vedea”) ca un „0”, altfel ar vedea un non-zero (șir de biți cu cel puțin un „1” în el).

Apoi pe bit | se face pe cele două valori, iar dacă oricare dintre ele este diferită de zero (are „1” biți în ea), atunci rezultatul va avea acei „1” biți în el (non-zero), iar instrucțiunea if va interpreta orice non- valoarea zero ca adevărată într-un test boolean. La fel, dacă ambii operanzi la | au fost nule sau 0, atunci rezultatul ar fi o valoare zero, pe care „dacă” ar interpreta ca falsă.

Declarația if de mai sus face un | pe (în acest caz) două valori diferite de zero (cu „1” în el la nivel de bit), deci | operația returnează o valoare diferită de zero, care este apoi reinterpretată de instrucțiunea if ca TRUE!

Deci, în acest caz special în care încercați să înșirați teste booleene nescurtcircuitate, acești operatori lucrează la operanzii lor la nivel de biți și, deoarece nu sunt operatori de comparație, ci operatori matematici, ei nu pot fi scurti. circuitat, iar comportamentul rezultat este un „test boolean” nescurtcircuitat.

Știu, trebuie să crezi că sunt nebun pentru că am încercat să ocolesc o optimizare încorporată ca aceasta, dar te asigur că există un motiv foarte bun pentru asta și, dacă ești interesat, poți consulta acest thread așa cum am făcut-o eu. o postare foarte lungă acolo care explică ceea ce încercam să fac:

Este a 9-a postare în jos, unde veți găsi descrierea mea a interogării bazei de date pe care doream să o optimizez.

Ceea ce probabil nu este ceea ce îți dorești.

Acest lucru poate fi de ajutor celor cărora le place codul să citească ca în engleză și ar putea crede că diferențele de precedență ale acestor operatori sunt relativ exotice: nu sunt.

În ceea ce mă privește, m-am confruntat cu această problemă pentru că nu există XOR logic simbolic (de exemplu, nu ^^), așa că a trebuit să folosesc XOR și apoi m-am gândit că în locuri similare ar trebui să folosesc AND și SAU și apoi codul s-a spart :)

Deci acum trebuie
$a = ($b xor $c);

Jesse Thompson
bend.com

yohgaki la hotmail dot com

În PHP4, „și”, „sau”, „&&”, „||” -- toate sunt „scurtcircuit” ca în C/C++. În PHP3, cred că nu a fost.

„Scurtcircuit” înseamnă că limbajul oprește evaluarea expresiei atunci când sunt determinate condiții. (Majoritatea limbajului utilizează evaluarea scurtcircuitelor pentru condiția logică)

$a = adevărat;
$b = fals;
dacă ($a || $b) (
}

Această declarație „dacă” evaluează doar $a, deoarece $a este adevărat și întreaga condiție trebuie să fie adevărată. (adică dacă $b este o funcție în loc de valoare, funcția nu va fi apelată)

muerte la web-ster dot com

Speram să găsesc un operator similar cu funcțiile ||= în perl. Primul meu gând ar fi:

$i = $i sau „implicit”

Dar sau nu funcționează așa. Dacă doriți să atribuiți o valoare implicită variabilelor dvs. numai dacă acestea nu sunt deja atribuite, puteți totuși să faceți:

$i sau $i = „implicit”

Primul exemplu NU funcționează deoarece operatorul or nu este supraîncărcat așa cum este în Perl.

dante at heartme punct com


Am vrut sa fac asa ceva:

$alegere1 = "";
$choice2 = „câine”;
$implicit = "altul";
$val = $alegere1 || $alegere2 || $implicit;

Dar atunci $val1 va conține doar 1 sau 0. În schimb, am făcut asta:

$alegere1 = "";
$choice2 = „câine”;
$implicit = "altul";
$val = $alegere1 sau $alegere2 sau $implicit;

Acum $val conținea șirul „câine”. Asta e
ciudat că „sau” este diferit de „||”... și aș face-o
cred că „||” ar trebui să fie suficient de inteligent pentru a se descurca
șiruri... așa cum face PERL. Nu cred. Poate este
o alegere de design.