Php dacă variabila este goală. Cheat sheet pentru PHP: FALSE, NULL și valorile asociate acestora. FALSE în declarațiile If

șir variabil (12)

Am o funcție isNotEmpty care returnează true dacă șirul nu este gol și false dacă șirul este gol. Am aflat că nu merge dacă trec o linie goală prin el.

Funcția isNotEmpty($input) ( $strTemp = $input; $strTemp = trim($strTemp); if(strTemp != "") //Am încercat și acest „if(strlen($strTemp) > 0)" ( returnează adevărat ;) returnează fals ;)

Șirul este verificat folosind isNotEmpty:

If(isNotEmpty($userinput["phoneNumber"])) ( //validați numărul de telefon ) else ( echo "Numărul de telefon nu a fost introdus
"; }

Dacă linia este goală, altfel nu se execută, nu înțeleg de ce, poate cineva să facă lumină în acest sens, vă rog.

Răspunsuri

dacă aveți un câmp și anume serial_number și doriți să verificați spațiul gol

$numar_serie = trim($_POST); $q="selectați * din produs unde user_id="$_SESSION""; $rs=mysql_query($q); while($row=mysql_fetch_assoc($rs))( if(empty($_POST["fiare de călcat"]))( $irons=$rând["produs1"]; )

în acest fel puteți itera prin toate buclele dintr-o buclă cu o altă funcție goală

Ei bine, în loc să răspund (cred că ți-ai rezolvat deja problema), o să-ți dau câteva sfaturi.

Nu știu despre toți ceilalți, dar personal sunt foarte enervat când văd ceva de genul:

Dacă(<>) ( return true; ) return false;

aceasta necesită o „întoarcere” elegantă (<>); " Vă rugăm să vă uitați întotdeauna la codul dvs. și să eliminați această logică. Pentru fiecare situație în care nu aveți nevoie de declarația IF.

Doar scriu propria mea funcție is_string pentru a verifica tipurile și strlen pentru a verifica lungimea.

Funcția emptyStr($str) ( return is_string($str) && strlen($str) === 0; ) print emptyStr("") ? „empty” : „nu este gol”; // gol

EDITARE: De asemenea, puteți utiliza funcția de tăiere pentru a verifica dacă un șir nu conține.

Is_string($str) && strlen(trim($str)) === 0;

PHP are o funcție încorporată numită empty() Testul se face tastând if(empty($string))(...) link php.net: php empty

Ai răspunsul, dar în cazul tău poți folosi

Returnează gol ($input);

Return is_string($input);

Problemă simplă. Schimbare:

If(strTemp != "")

Dacă($strTemp != "")

Poate că o poți schimba și în:

If($strTemp !== "")

deoarece != "" va returna true dacă treceți numărul numeric 0 și alte câteva cazuri din cauza conversiei automate a tipului PHP.

De asemenea, rețineți că PHP are deja o funcție empty().

PHP evaluează un șir gol la fals, așa că puteți utiliza pur și simplu:

If (trim($userinput["phoneNumber"])) ( // validează numărul de telefon ) else ( echo "Numărul de telefon nu a fost introdus
"; }

Folosesc întotdeauna regex pentru a verifica dacă există un șir gol, datând din zilele CGI/Perl, precum și Javascript, așa că de ce nu PHP, de exemplu (deși netestat)

Returnează preg_match("/\S/", $input);

Unde \S reprezintă orice caracter fără spații

Folosiți doar funcția strlen().

Dacă (strlen($s)) ( // nu este gol )

Recent mi-am pus aceeași întrebare.
Există mai multe soluții posibile, iată 3 valide:

  • s.indexOf(starter) === 0
  • s.substr(0,starter.length) === starter
  • s.lastIndexOf(starter, 0) === 0 (adăugat după vizualizarea răspunsului lui Mark Bayer)
  • folosind o buclă:

    Funcția startsWith(s,starter) ( pentru (var i = 0,cur_c; i< starter.length; i++) { cur_c = starter[i]; if (s[i] !== starter[i]) { return false; } } return true; }

Nu am întâlnit ultima soluție care implică utilizarea unei bucle.
În mod surprinzător, această soluție este semnificativ superioară primelor 3.
Iată testul jsperf pe care l-am rulat pentru a ajunge la această concluzie: http://jsperf.com/startswith2/2

ps: ecmascript 6 (armonie) introduce propria metodă startsWith pentru șiruri.
Gândiți-vă cât timp ar fi fost economisit dacă s-ar fi gândit să includă această metodă atât de necesară în prima versiune.

Actualizați

Rețineți că există 2 optimizări de buclă pe care Steve le-a inclus, prima dintre cele două a arătat o performanță mai bună, așa că voi posta acel cod mai jos:

Funcția startsWith2(str, prefix) ( if (str.length< prefix.length) return false; for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefix[i]); --eu continui; intoarce i< 0; }

Programarea modernă a manipulat cu succes variabilele netipizate de mult timp. Tipul variabilei nu poate fi specificat în prealabil și poate fi modificat în timpul execuției programului.

Acest concept a devenit central pentru paradigma generală de programare. La începutul erei programării, limbajele cu aceeași încredere aprofundată solicitau programatorului să predefiniască variabilele și se asigurau cu strictețe că nu li se atribuie nimic ilegal. Nici programele, nici limbajele de programare nu aveau idee înainte că o variabilă își schimbă tipul.

Despre gol și inexistent

Funcția PHP empty() este inversa funcției isset() și are câteva caracteristici speciale de utilizare. Dacă nu există o variabilă, atunci prima funcție răspunde pozitiv și rezultatul ei este adevărat, iar a doua răspunde negativ, adică valoarea ei va fi falsă.

Prin definiție, isset() este conceput pentru a verifica existența unei variabile. Nu contează ce și cum a fost atribuită variabila, principalul lucru este că aceasta există și nu este distrusă de funcția unset(). Rezultatul funcției isset() va fi pozitiv - adevărat. Este important de reținut că dacă $iVar = 0; atunci isset($iVar) va fi adevărat, dar empty($iVar) va fi și adevărat.

În primul caz, rezultatul înseamnă că variabila există, în al doilea caz, variabila este goală, adică valoarea „0” sub orice formă, fie că este un șir („0”) sau un număr (fracțional - 0.0 sau întreg - 0) este același: empty($iVar) va fi adevărat.

Despre securitate și control

Practica arată că limbajele netipizate oferă mult mai multă libertate programatorului, dar presupunem că atitudinea lui față de lucrul la algoritm este mai responsabilă.

PHP oferă o sintaxă modernă care acceptă o semantică stabilită, are puține erori, dar necesită o atenție deosebită. De exemplu, apelarea oricărei funcții necesită un anumit număr de parametri.

Când apelați o funcție, nu este deloc necesar să treceți toți parametrii; puteți trece doar o parte semnificativă a acestora. Funcția „trebuie” să verifice prezența și existența tuturor parametrilor. Cele care lipsesc sau au valori incorecte trebuie să fie restaurate la forma normală și să li se atribuie valorile necesare.

În acest context, funcția PHP empty() este esențială. Expresie:

$a = "1;2" + 20

va atribui valoarea 21 variabilei $a, deoarece prima parte a expresiei va fi reprezentată ca 1, iar a doua va fi 20.

Rezultatul va fi de tip number iar funcția PHP empty($a) va avea rezultatul - false, adică variabila $a nu este goală.

În acest context, având o funcție:

funcTest($a ​​​​= 0, $b = 20)

Când suni:

$res = funcTest($aVal, $bVal)

va avea ceea ce se dorește, adică rezultatul funcției. Si cand sunt sunati:

  • $res = funcTest($aVal. $bVal)

Corpul funcției conține un singur parametru cu valoarea "$aVal . $bVal" și cel mai probabil acest parametru va fi interpretat ca un șir de caractere.

PHP empty() pentru obiecte și matrice

Sintaxa limbajului are un număr suficient de constructe și funcții pentru lucrul cu obiecte și tablouri, dar din punctul de vedere al verificării existenței acestora și a prezenței unei valori, nu există diferențe deosebite față de variabile.

PHP empty (matrice) - echivalent cu apelarea empty (variabilă simplă). Cu toate acestea, există considerații foarte semnificative în ceea ce privește obiectele. În ceea ce privește verificarea existenței unui obiect (isset), întrebarea nu are sens. În ceea ce privește funcția PHP empty(), oportunitatea utilizării acesteia rămâne discutabilă.

Conform logicii programării orientate pe obiecte, un obiect are propriul său conținut și propriul set de metode. Numai obiectul în sine poate spune dacă este gol sau nu, dar nu o funcție terță parte, chiar dacă face parte din sintaxa limbajului.

Un obiect și funcția sa empty()

Pe această bază simplă, dar legitimă, fiecare obiect ar trebui luat în considerare în contextul înțelegerii sale a „vidului”. De exemplu, implementarea obiectului „Tabel de personal” constă din înregistrări „Angajat”. Dar dacă nu există un singur angajat, atunci în „Lista de personal” există întotdeauna opțiuni pentru pozițiile potențialilor angajați.

La ce nivel ar trebui să folosesc aici funcția de obiect gol PHP? La nivel de „Personal”, totul există, chiar dacă nu există un singur angajat. La nivelul „Angajat”, obiectul există deja, chiar dacă nu este complet umplut. Un obiect care nu este complet umplut poate fi clasificat ca un obiect gol. Nu există niciun beneficiu pentru masa de personal.

În funcție de stilul tău de programare, funcțiile PHP empty() și isset() sunt foarte importante pentru construirea unui algoritm sigur și de încredere, dar pentru obiecte este totuși mai bine să ai o variantă de empty() definită de conținutul său.

În PHP, valorile FALSE și NULL și valorile asociate acestora sunt diferite de modul în care sunt de obicei în alte limbi și au propriile lor caracteristici neevidente.
Articolul discută aceste caracteristici.
Pentru începători, acest lucru poate fi util pentru a vedea imaginea completă; pentru cititorii experimentați, poate fi util să-și împrospătească memoria dacă le-a scăpat din minte o nuanță.

FALSE în declarațiile If

Conform documentației PHP, următoarele valori sunt FALSE după turnarea în boolean:
  • valoarea booleană în sine este FALSĂ
  • un șir gol ("") și șirul "0".
  • matrice goală (matrice) – matrice ().
  • un obiect cu variabile membre zero (numai PHP 4, neacoperit în acest articol)
  • valoare specială NULL (inclusiv variabile nesetate)
  • Obiecte SimpleXML (nu sunt acoperite în acest articol)
Aceasta înseamnă că, dacă astfel de valori sunt trecute la condiția:
dacă (…) ecou „1”; altfel ecou „0”;
apoi va fi tipărit șirul „0”.

Dacă valoarea variabilei nu este setată (dezactivată), atunci poate fi emisă și o avertizare. Să vă reamintim că avertismentul din condiție poate fi eliminat scriind @ înaintea variabilei.

De exemplu:

Dacă (@$undefVar) ( …)
Dar ar trebui să folosești @ numai în cazuri extreme, când te-ai gândit cu atenție și nu există alte opțiuni potrivite. Vedeți funcția isset().

Funcția is_null() și construcția limbajului isset() și empty()

is_null() returnează TRUE numai pentru variabilele cărora nu li se atribuie nicio valoare sau cărora li se atribuie valoarea NULL .
isset() returnează valori booleene unu-la-unu în comparație cu is_null() .
Dacă variabilei nu i se atribuie o valoare, atunci is_null() emite și un avertisment „Variabilă nedefinită”, spre deosebire de isset(), care nu emite niciun avertisment.
Amintiți-vă că pentru a elimina valoarea unei variabile, puteți utiliza funcția unset(). De asemenea, puteți atribui valoarea NULL în acest scop pentru a evita avertismentele compilatorului atunci când încercați să citiți valoarea unei variabile.

Vă rugăm să rețineți că, spre deosebire de variabile, pentru a lucra cu constante trebuie să utilizați constructul definit().

Reprezentare cu șiruri

Să ne uităm la reprezentarea în șir a constantelor false.
De exemplu, concatenarea convertește valorile în următoarele șiruri, prezentate în tabelul de mai jos:

Subiectul conversiei în șiruri este descris mai detaliat pe site-ul oficial în paragraful Convertirea în șir.

Operatori de comparație

Să trecem la operatorii de comparație.
Toate valorile false revin adevărate, așa cum era de așteptat, în comparație cu FALSE folosind operatorul „ ==”.
Dar nu ar trebui să vă bazați pe tranzitivitate aici atunci când comparați constante de șir false între ele.
Iată un tabel complet pentru compararea valorilor false (plus denotă elemente de tabel care, atunci când sunt comparate folosind operatorul " != ", returnează o valoare adevărată:

$undef – o variabilă căreia nu i-a fost atribuită o valoare

Din tabel se pot trage câteva concluzii plăcute:
1. Dacă știm că folosim doar șiruri, atunci le putem compara în siguranță și nu ne facem griji că „” (un șir gol) va fi egal cu „0”.
2. Matricele nu sunt niciodată egale cu șiruri, numere întregi sau numere reale.

Deoarece tipurile diferitelor constante false sunt diferite, o pereche de operatori === și !== pot fi utilizați pentru a le distinge.
Operatorul === returnează false pentru toate perechile de valori false.
Returnează valoarea adevărată numai pentru argumentele dintre care unuia i se atribuie valoarea NULL, iar celui de-al doilea nu i se atribuie nicio valoare.

Diferența dintre variabilele cu valoare NULL și variabilele nedefinite

Operatorul === vă permite să distingeți între toate valorile false, cu excepția variabilelor cu o valoare NULL de variabilele cărora nu li s-a atribuit o valoare.

Astfel de variabile pot fi distinse folosind funcția get_defined_vars().

Dacă trebuie să determinați dacă o valoare a fost atribuită variabilei $var, puteți utiliza următorul fragment de cod pentru a face acest lucru:
if (array_key_exists("var", get_defined_vars())) ( echo "var este definit"; // $var este atribuit NULL ) else ( echo "var NU este definit"; // $var nu este definit sau nesetat($ var) a fost numit)

concluzii

Ar trebui să vă amintiți întotdeauna că în PHP, două valori false pot să nu fie egale una cu cealaltă, iar variabilele care par diferite la prima vedere se pot dovedi a fi aceleași atunci când sunt comparate. Pentru a evita astfel de surprize, puteți folosi operatorii === și !==.

Când lucrați cu matrice, pentru a evita surprizele, puteți scrie o funcție pentru a converti valorile în indici diferiți garantați. După aceea, elementele matricei pot fi accesate doar folosindu-l. Acest lucru poate încetini programul, dar va ajuta la evitarea surprizelor.

Testarea a fost efectuată pe PHP 5.3.1.

Link-uri suplimentare

1. Tabele de comparație de tip PHP.
2. MySQL Null și Empty Strings în contextul PHP.

Etichete: Adăugați etichete

În PHP, valorile FALSE și NULL și valorile asociate acestora sunt diferite de modul în care sunt de obicei în alte limbi și au propriile lor caracteristici neevidente.
Articolul discută aceste caracteristici.
Pentru începători, acest lucru poate fi util pentru a vedea imaginea completă; pentru cititorii experimentați, poate fi util să-și împrospătească memoria dacă le-a scăpat din minte o nuanță.

FALSE în declarațiile If

Conform documentației PHP, următoarele valori sunt FALSE după turnarea în boolean:
  • valoarea booleană în sine este FALSĂ
  • un șir gol ("") și șirul "0".
  • matrice goală (matrice) – matrice ().
  • un obiect cu variabile membre zero (numai PHP 4, neacoperit în acest articol)
  • valoare specială NULL (inclusiv variabile nesetate)
  • Obiecte SimpleXML (nu sunt acoperite în acest articol)
Aceasta înseamnă că, dacă astfel de valori sunt trecute la condiția:
dacă (…) ecou „1”; altfel ecou „0”;
apoi va fi tipărit șirul „0”.

Dacă valoarea variabilei nu este setată (dezactivată), atunci poate fi emisă și o avertizare. Să vă reamintim că avertismentul din condiție poate fi eliminat scriind @ înaintea variabilei.

De exemplu:

Dacă (@$undefVar) ( …)
Dar ar trebui să folosești @ numai în cazuri extreme, când te-ai gândit cu atenție și nu există alte opțiuni potrivite. Vedeți funcția isset().

Funcția is_null() și construcția limbajului isset() și empty()

is_null() returnează TRUE numai pentru variabilele cărora nu li se atribuie nicio valoare sau cărora li se atribuie valoarea NULL .
isset() returnează valori booleene unu-la-unu în comparație cu is_null() .
Dacă variabilei nu i se atribuie o valoare, atunci is_null() emite și un avertisment „Variabilă nedefinită”, spre deosebire de isset(), care nu emite niciun avertisment.
Amintiți-vă că pentru a elimina valoarea unei variabile, puteți utiliza funcția unset(). De asemenea, puteți atribui valoarea NULL în acest scop pentru a evita avertismentele compilatorului atunci când încercați să citiți valoarea unei variabile.

Vă rugăm să rețineți că, spre deosebire de variabile, pentru a lucra cu constante trebuie să utilizați constructul definit().

Reprezentare cu șiruri

Să ne uităm la reprezentarea în șir a constantelor false.
De exemplu, concatenarea convertește valorile în următoarele șiruri, prezentate în tabelul de mai jos:

Subiectul conversiei în șiruri este descris mai detaliat pe site-ul oficial în paragraful Convertirea în șir.

Operatori de comparație

Să trecem la operatorii de comparație.
Toate valorile false revin adevărate, așa cum era de așteptat, în comparație cu FALSE folosind operatorul „ ==”.
Dar nu ar trebui să vă bazați pe tranzitivitate aici atunci când comparați constante de șir false între ele.
Iată un tabel complet pentru compararea valorilor false (plus denotă elemente de tabel care, atunci când sunt comparate folosind operatorul " != ", returnează o valoare adevărată:

$undef – o variabilă căreia nu i-a fost atribuită o valoare

Din tabel se pot trage câteva concluzii plăcute:
1. Dacă știm că folosim doar șiruri, atunci le putem compara în siguranță și nu ne facem griji că „” (un șir gol) va fi egal cu „0”.
2. Matricele nu sunt niciodată egale cu șiruri, numere întregi sau numere reale.

Deoarece tipurile diferitelor constante false sunt diferite, o pereche de operatori === și !== pot fi utilizați pentru a le distinge.
Operatorul === returnează false pentru toate perechile de valori false.
Returnează valoarea adevărată numai pentru argumentele dintre care unuia i se atribuie valoarea NULL, iar celui de-al doilea nu i se atribuie nicio valoare.

Diferența dintre variabilele cu valoare NULL și variabilele nedefinite

Operatorul === vă permite să distingeți între toate valorile false, cu excepția variabilelor cu o valoare NULL de variabilele cărora nu li s-a atribuit o valoare.

Astfel de variabile pot fi distinse folosind funcția get_defined_vars().

Dacă trebuie să determinați dacă o valoare a fost atribuită variabilei $var, puteți utiliza următorul fragment de cod pentru a face acest lucru:
if (array_key_exists("var", get_defined_vars())) ( echo "var este definit"; // $var este atribuit NULL ) else ( echo "var NU este definit"; // $var nu este definit sau nesetat($ var) a fost numit)

concluzii

Ar trebui să vă amintiți întotdeauna că în PHP, două valori false pot să nu fie egale una cu cealaltă, iar variabilele care par diferite la prima vedere se pot dovedi a fi aceleași atunci când sunt comparate. Pentru a evita astfel de surprize, puteți folosi operatorii === și !==.

Când lucrați cu matrice, pentru a evita surprizele, puteți scrie o funcție pentru a converti valorile în indici diferiți garantați. După aceea, elementele matricei pot fi accesate doar folosindu-l. Acest lucru poate încetini programul, dar va ajuta la evitarea surprizelor.

Dacă, atunci când lucrați cu șiruri, trebuie să verificați dacă un șir este gol, programatorii începători folosesc de obicei funcția strlen(). Această funcție este destul de rapidă deoarece nu efectuează niciun calcul, ci pur și simplu returnează valoarea deja cunoscută a lungimii șirului, disponibilă în zval (PHP folosește o structură C pentru a stoca variabile). Dar totuși, pentru că strlen()- aceasta este o funcție, este puțin lentă deoarece necesită mai multe acțiuni atunci când este apelată, cum ar fi conversia în litere mici și căutarea în tabelul hash. În unele cazuri, puteți crește viteza de execuție a codului folosind gol()..., dar de asemenea gol()Îl poți optimiza în continuare puțin.

Să luăm un exemplu De exemplu verificarea traseului imaginii, funcția verifică dacă calea este goală, apoi o înlocuiește cu o altă cale, de exemplu „images/noimage.jpg”.

Și astfel, întreaga sarcină se rezumă la verificarea dacă o variabilă de tip șir este goală. Să încercăm 4 moduri:

  • if(strlen($img_path)>0)
  • if($img_path(0))
  • dacă(gol ($img_path))
  • și încă o cale pentru final.

Și așa vom scrie în primul mod:

Funcția check_image_path($img_path ) ( if (strlen ($img_path ) >0 ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

Să efectuăm testarea, timpul mediu de testare a durat 1.43795800209 sec.

Gândindu-mă puțin la asta... Puteți accesa primul caracter al rândului deodată, mai degrabă decât întreaga linie. Dacă primul caracter este acolo, atunci șirul nu este gol. Primul caracter din rând este numerotat cu „0”.

Funcția check_image_path($img_path) ( if ($img_path ( 0 ) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

timpul mediu de testare a durat 1.19431300163 sec., 17% din timp jucat

Să încercăm să scriem folosind empty() acum:

Funcția check_image_path($img_path) ( if (gol ($img_path) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

timpul mediu de testare a durat 1.1341319084 sec., 5% din timp redat din exemplul anterior

Acum să ne uităm la penultimul și ultimul exemplu de deasupra noastră. Să vedem cum se poate combina acest lucru. gandeste-te... cum altfel poti optimiza?

Funcția check_image_path($img_path) ( if (empty ($img_path ( 0 ) ) ) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

timpul mediu de testare a durat 1.07465314865 sec., și din nou am câștigat 5% din timp...

Cum funcționează și de ce este mai rapid? Si aici $img_path(0) returnează primul caracter... și apoi funcția gol() verifică pentru un șir gol... diferența față de exemplul anterior este că numai un caracter este transmis funcției, și nu întregul șir. Astfel, de la primul exemplu până la ultimul am câștigat 25% timp.