Kuidas kontrollida, kas muutuja on php-s tühi või mitte. PHP petuleht: FALSE, NULL ja nendega seotud väärtused. Funktsioon is_null() ja keelekonstruktsioonid isset() ja empty()

PHP-s on väärtused FALSE ja NULL ning nendega seotud väärtused erinevad sellest, kuidas need tavaliselt on teistes keeltes, ja neil on oma mitteilmne tunnusjoon.
Artiklis käsitletakse neid funktsioone.
Algajatele võib see olla kasulik tervikpildi nägemiseks, kogenud lugejale võib olla kasulik mälu värskendada, kui mõni nüanss on meelest läinud.

VÄÄR Ifi väidetes

PHP dokumentatsiooni kohaselt on järgmised väärtused pärast tõeväärtuse ülekandmist FALSE:
  • tõeväärtus ise on FALSE
  • tühi string ("") ja string "0".
  • tühi massiiv (massiiv) – array().
  • nullliikmeliste muutujatega objekt (ainult PHP 4, selles artiklis ei käsitleta)
  • spetsiaalne NULL väärtus (kaasa arvatud määramata muutujad)
  • SimpleXML-objektid (selles artiklis ei käsitleta)
See tähendab, et kui sellised väärtused antakse tingimusele:
kui (…) kajab “1”; muidu kaja "0";
siis trükitakse string "0".

Kui muutuja väärtus ei ole seatud (unset), võidakse anda ka hoiatus. Tuletame meelde, et tingimuse hoiatuse saab eemaldada, kirjutades muutuja ette @.

Näiteks:

Kui (@$undefVar) (…)
Kuid @-d tuleks kasutada ainult äärmuslikel juhtudel, kui olete hoolikalt läbi mõelnud ja muid sobivaid võimalusi pole. Vaadake funktsiooni isset().

Funktsioon is_null() ja keelekonstruktsioonid isset() ja empty()

is_null() tagastab väärtuse TRUE ainult nende muutujate puhul, millele ei ole määratud väärtust või millele on määratud väärtus NULL .
isset() tagastab üks-ühele tõeväärtused võrreldes väärtusega is_null().
Kui muutujale ei omistata väärtust, annab is_null() erinevalt isset()-st, mis hoiatust ei anna, ka "Määratlemata muutuja" hoiatuse.
Tuletage meelde, et muutuja väärtuse eemaldamiseks võite kasutada funktsiooni unset(). Selleks saate määrata ka väärtuse NULL, et vältida kompilaatori hoiatusi muutuja väärtuse lugemisel.

Pange tähele, et erinevalt muutujatest peate konstantidega töötamiseks kasutama konstruktsiooni defineeritud().

Stringi esitus

Vaatame valekonstantide stringi esitust.
Näiteks teisendab konkatenatsioon väärtused järgmisteks stringideks, mis on näidatud allolevas tabelis:

Stringideks teisendamise teemat kirjeldatakse üksikasjalikumalt ametlikul veebisaidil jaotises Stringiks teisendamine.

Võrdlusoperaatorid

Liigume edasi võrdlusoperaatorite juurde.
Kõik valed väärtused tagastavad ootuspäraselt tõesed, kui võrrelda operaatorit " == " kasutades väärtusega FALSE.
Kuid valede stringikonstantide omavahelisel võrdlemisel ei tohiks siin loota transitiivsusele.
Siin on täielik tabel valede väärtuste võrdlemiseks (pluss tähistab tabelielemente, mis operaatoriga " != " võrdlemisel tagastavad tõese väärtuse:

$undef – muutuja, millele pole väärtust määratud

Tabelist saab teha mõned meeldivad järeldused:
1. Kui teame, et kasutame ainult stringe, siis võime neid julgelt võrrelda ja mitte muretseda, et "" (tühi string) võrdub "0"-ga.
2. Massiivid ei ole kunagi võrdsed stringide, täisarvude ega reaalarvudega.

Kuna erinevate valekonstantide tüübid on erinevad, saab nende eristamiseks kasutada tehtepaari === ja !==.
Operaator === tagastab kõigi valeväärtuste paaride puhul väärtuse false.
Tagastab tõese väärtuse ainult argumentide puhul, millest ühele on määratud väärtus NULL ja teisele väärtust ei omistata.

Erinevus NULL väärtusega muutujate ja määratlemata muutujate vahel

Operaator === võimaldab teil eristada kõiki valeväärtusi, välja arvatud NULL-väärtusega muutujad muutujatest, millele pole väärtust määratud.

Selliseid muutujaid saab eristada funktsiooni get_defined_vars() abil.

Kui teil on vaja kindlaks teha, kas muutujale $var on määratud väärtus, saate selleks kasutada järgmist koodilõiku:
if (massiivi_võti_exists("var", get_defined_vars())) ( echo "var on defineeritud"; // $var on määratud NULL ) else ( echo "var EI ole defineeritud"; // $var ei ole defineeritud või unset($ var) kutsuti)

järeldused

Peaksite alati meeles pidama, et PHP-s ei pruugi kaks valeväärtust olla üksteisega võrdsed ja esmapilgul erinevad muutujad võivad võrdluses osutuda samaks. Selliste üllatuste vältimiseks võite kasutada tehteid === ja !==.

Massiividega töötades saate üllatuste vältimiseks kirjutada funktsiooni väärtuste teisendamiseks garanteeritud erinevateks indeksiteks. Pärast seda pääseb massiivi elementidele juurde ainult seda kasutades. See võib programmi aeglustada, kuid aitab vältida üllatusi.

Testimine viidi läbi PHP 5.3.1-ga.

Täiendavad lingid

1. PHP tüüpi võrdlustabelid.
2. MySQL Null ja Empty Strings PHP kontekstis.

Sildid: lisa sildid

muutuv string (12)

Mul on funktsioon isNotEmpty, mis tagastab tõese, kui string ei ole tühi, ja false, kui string on tühi. Sain teada, et see ei tööta, kui annan tühja rea ​​sealt läbi.

Funktsioon isNotEmpty($input) ( $strTemp = $sisend; $strTemp = trim($strTemp); if(strTemp != "") //Proovisin ka seda "if(strlen($strTemp) > 0)" ( return true ;) tagasta vale;)

Stringi kontrollitakse käsuga isNotEmpty:

If(isNotEmpty($userinput["phoneNumber"])) ( //telefoninumbri kinnitamine ) else ( echo "Telefoninumbrit pole sisestatud
"; }

Kui rida on tühi, muidu ei täideta, siis ma ei saa aru, miks, kas keegi võiks seda valgustada, palun.

Vastused

kui teil on väli, nimelt seerianumber ja soovite kontrollida tühja ruumi olemasolu

$seeria_number = trimmi($_POST); $q="vali * tootest, kus user_id="$_SESSION""; $rs=mysql_query($q); while($row=mysql_fetch_assoc($rs))(if(empty($_POST["rauad"]))( $rauad=$rida["toode1"]; )

nii saate itereerida läbi kõik tsüklid tsüklis teise tühja funktsiooniga

Noh, selle asemel, et vastata (ma usun, et olete oma probleemi juba lahendanud), annan teile nõu.

Ma ei tea, kuidas kõik teised on, aga mind isiklikult ajab väga närvi, kui näen midagi sellist:

Kui(<>) ( return true; ) return false;

see nõuab elegantset " tagasitulekut (<>); " Palun vaadake alati oma koodi ja eemaldage see loogika. Sest iga olukorras ei vaja te IF-lauset.

Kirjutan lihtsalt oma funktsiooni is_string, et kontrollida tüüpe ja strlen, et kontrollida pikkust.

Funktsioon emptyStr($str) ( return is_string($str) && strlen($str) === 0; ) print emptyStr("") ? "tühi" : "mitte tühi"; // tühi

EDIT: saate kasutada ka kärpimisfunktsiooni, et kontrollida, kas string ei sisalda.

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

PHP-l on sisseehitatud funktsioon, mida nimetatakse tühjaks() Test tehakse, sisestades if(empty($string))(...) php.net link: php empty

Teil on vastus olemas, kuid teie puhul saate seda kasutada

Tagasi tühi($input);

Tagastus on_string($sisend);

Lihtne probleem. Muuda:

If(strTemp != "")

If($strTemp != "")

Võib-olla saate selle ka muuta järgmiselt:

If($strTemp !== "")

kuna != "" tagastab tõene, kui edastate PHP automaatse tüübikonversiooni tõttu numbrilise arvu 0 ja mõned muud juhtumid.

Samuti pidage meeles, et PHP-l on juba tühi() funktsioon.

PHP hindab tühja stringi valeks, nii et saate lihtsalt kasutada:

If (trim($userinput["phoneNumber"])) ( // kinnita telefoninumber ) else ( echo "Telefoninumbrit pole sisestatud
"; }

Kasutan alati regexit tühja stringi kontrollimiseks, mis pärineb nii CGI/Perli kui ka Javascripti aegadest, miks mitte näiteks PHP (kuigi testimata)

Return preg_match("/\S/", $sisend);

Kus \S tähistab mis tahes märki ilma tühikuteta

Kasutage lihtsalt funktsiooni strlen().

If (strlen($s)) ( // ei ole tühi )

Küsisin endalt hiljuti sama küsimuse.
Võimalikke lahendusi on mitu, siin on 3 kehtivat:

  • s.indexOf(starter) === 0
  • s.substr(0,starter.length) === starter
  • s.lastIndexOf(starter, 0) === 0 (lisatud pärast Mark Bayeri vastuse vaatamist)
  • kasutades silmust:

    Funktsioon algabWith(s,starter) ( for (var i = 0,cur_c; i< starter.length; i++) { cur_c = starter[i]; if (s[i] !== starter[i]) { return false; } } return true; }

Ma ei ole kohanud viimast lahendust, mis hõlmab silmuse kasutamist.
Üllataval kombel on see lahendus oluliselt parem kui kolm esimest.
Siin on jsperfi test, mille läbisin, et jõuda sellele järeldusele: http://jsperf.com/startswith2/2

ps: ecmascript 6 (harmony) tutvustab stringide jaoks oma startsWith meetodit.
Mõelge, kui palju aega oleks säästetud, kui nad oleksid mõelnud lisada selle väga vajaliku meetodi esimesse versiooni.

Värskenda

Pange tähele, et Steve kaasas 2 silmuse optimeerimist, millest esimene näitas paremat jõudlust, seega postitan selle koodi allpool:

Funktsioon algabWith2(str, prefiks) ( if (str.length< prefix.length) return false; for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefiks[i]); --i) jätka; tagasi i< 0; }

PHP-s on väärtused FALSE ja NULL ning nendega seotud väärtused erinevad sellest, kuidas need tavaliselt on teistes keeltes, ja neil on oma mitteilmne tunnusjoon.
Artiklis käsitletakse neid funktsioone.
Algajatele võib see olla kasulik tervikpildi nägemiseks, kogenud lugejale võib olla kasulik mälu värskendada, kui mõni nüanss on meelest läinud.

VÄÄR Ifi väidetes

PHP dokumentatsiooni kohaselt on järgmised väärtused pärast tõeväärtuse ülekandmist FALSE:
  • tõeväärtus ise on FALSE
  • tühi string ("") ja string "0".
  • tühi massiiv (massiiv) – array().
  • nullliikmeliste muutujatega objekt (ainult PHP 4, selles artiklis ei käsitleta)
  • spetsiaalne NULL väärtus (kaasa arvatud määramata muutujad)
  • SimpleXML-objektid (selles artiklis ei käsitleta)
See tähendab, et kui sellised väärtused antakse tingimusele:
kui (…) kajab “1”; muidu kaja "0";
siis trükitakse string "0".

Kui muutuja väärtus ei ole seatud (unset), võidakse anda ka hoiatus. Tuletame meelde, et tingimuse hoiatuse saab eemaldada, kirjutades muutuja ette @.

Näiteks:

Kui (@$undefVar) (…)
Kuid @-d tuleks kasutada ainult äärmuslikel juhtudel, kui olete hoolikalt läbi mõelnud ja muid sobivaid võimalusi pole. Vaadake funktsiooni isset().

Funktsioon is_null() ja keelekonstruktsioonid isset() ja empty()

is_null() tagastab väärtuse TRUE ainult nende muutujate puhul, millele ei ole määratud väärtust või millele on määratud väärtus NULL .
isset() tagastab üks-ühele tõeväärtused võrreldes väärtusega is_null().
Kui muutujale ei omistata väärtust, annab is_null() erinevalt isset()-st, mis hoiatust ei anna, ka "Määratlemata muutuja" hoiatuse.
Tuletage meelde, et muutuja väärtuse eemaldamiseks võite kasutada funktsiooni unset(). Selleks saate määrata ka väärtuse NULL, et vältida kompilaatori hoiatusi muutuja väärtuse lugemisel.

Pange tähele, et erinevalt muutujatest peate konstantidega töötamiseks kasutama konstruktsiooni defineeritud().

Stringi esitus

Vaatame valekonstantide stringi esitust.
Näiteks teisendab konkatenatsioon väärtused järgmisteks stringideks, mis on näidatud allolevas tabelis:

Stringideks teisendamise teemat kirjeldatakse üksikasjalikumalt ametlikul veebisaidil jaotises Stringiks teisendamine.

Võrdlusoperaatorid

Liigume edasi võrdlusoperaatorite juurde.
Kõik valed väärtused tagastavad ootuspäraselt tõesed, kui võrrelda operaatorit " == " kasutades väärtusega FALSE.
Kuid valede stringikonstantide omavahelisel võrdlemisel ei tohiks siin loota transitiivsusele.
Siin on täielik tabel valede väärtuste võrdlemiseks (pluss tähistab tabelielemente, mis operaatoriga " != " võrdlemisel tagastavad tõese väärtuse:

$undef – muutuja, millele pole väärtust määratud

Tabelist saab teha mõned meeldivad järeldused:
1. Kui teame, et kasutame ainult stringe, siis võime neid julgelt võrrelda ja mitte muretseda, et "" (tühi string) võrdub "0"-ga.
2. Massiivid ei ole kunagi võrdsed stringide, täisarvude ega reaalarvudega.

Kuna erinevate valekonstantide tüübid on erinevad, saab nende eristamiseks kasutada tehtepaari === ja !==.
Operaator === tagastab kõigi valeväärtuste paaride puhul väärtuse false.
Tagastab tõese väärtuse ainult argumentide puhul, millest ühele on määratud väärtus NULL ja teisele väärtust ei omistata.

Erinevus NULL väärtusega muutujate ja määratlemata muutujate vahel

Operaator === võimaldab teil eristada kõiki valeväärtusi, välja arvatud NULL-väärtusega muutujad muutujatest, millele pole väärtust määratud.

Selliseid muutujaid saab eristada funktsiooni get_defined_vars() abil.

Kui teil on vaja kindlaks teha, kas muutujale $var on määratud väärtus, saate selleks kasutada järgmist koodilõiku:
if (massiivi_võti_exists("var", get_defined_vars())) ( echo "var on defineeritud"; // $var on määratud NULL ) else ( echo "var EI ole defineeritud"; // $var ei ole defineeritud või unset($ var) kutsuti)

järeldused

Peaksite alati meeles pidama, et PHP-s ei pruugi kaks valeväärtust olla üksteisega võrdsed ja esmapilgul erinevad muutujad võivad võrdluses osutuda samaks. Selliste üllatuste vältimiseks võite kasutada tehteid === ja !==.

Massiividega töötades saate üllatuste vältimiseks kirjutada funktsiooni väärtuste teisendamiseks garanteeritud erinevateks indeksiteks. Pärast seda pääseb massiivi elementidele juurde ainult seda kasutades. See võib programmi aeglustada, kuid aitab vältida üllatusi.

Kui stringidega töötades peate kontrollima, kas string on tühi, kasutavad algajad programmeerijad tavaliselt funktsiooni strlen(). See funktsioon on üsna kiire, kuna see ei teosta arvutusi, vaid lihtsalt tagastab stringi pikkuse juba teadaoleva väärtuse, mis on saadaval zval-is (PHP kasutab muutujate salvestamiseks C-struktuuri). Aga ikkagi, sest strlen()- see on funktsioon, see on veidi aeglane, kuna selle kutsumine nõuab mitut toimingut, näiteks väiketähtedeks teisendamist ja räsitabelist otsimist. Mõnel juhul saate oma koodi täitmiskiirust suurendada kasutades tühi()..., aga ka tühi() Saate seda siiski veidi optimeerida.

Võtame näite Näiteks pildi teekonna kontrollimine, kontrollib funktsioon, kas tee on tühi, seejärel asendab selle teise teega, näiteks “images/noimage.jpg”.

Ja nii taandubki kogu ülesanne kontrollimisele, kas stringi tüüpi muutuja on tühi. Proovime 4 võimalust:

  • if(strlen($img_path)>0)
  • if($img_path(0))
  • if(tühi($img_path))
  • ja veel üks viis viimaseks.

Ja nii me kirjutame esimesel viisil:

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

Teeme testimise, keskmine katseaeg võttis 1.43795800209 sek.

Mõeldes sellele veidi lähemalt... Saate korraga juurde pääseda rea ​​esimesele märgile, mitte tervele reale. Kui esimene märk on seal, siis ei ole string tühi. Rea esimene märk on nummerdatud "0-ga".

Funktsioon check_image_path($img_path) ( if ($img_path ( 0 ) ) ( $img_path = "images/noimage.jpg" ; ) tagastab $img_path ; )

keskmine katseaeg võttis 1.19431300163 sekundit, 17% mängitud ajast

Proovime nüüd kirjutada tühja() abil:

Funktsioon check_image_path($img_path) ( if (tühi ($img_path) ) ( $img_path = "images/noimage.jpg" ; ) tagastab $img_path ; )

keskmine katseaeg võttis 1.1341319084 sek., 5% eelmisest näitest taasesitatud ajast

Vaatame nüüd eelviimast ja viimast näidet meie kohal. Vaatame, kuidas seda kombineerida. mõtle... kuidas muidu optimeerida saab?

Funktsioon check_image_path($img_path) ( if (tühi ($img_path ( 0 ) ) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

keskmine katseaeg võttis 1.07465314865 sekundit ja jälle võitsime 5% ajast...

Kuidas see töötab ja miks see on kiirem? Ja siin $img_path(0) tagastab esimese märgi... ja seejärel funktsiooni tühi() kontrollib tühja stringi... erinevus eelmisest näitest seisneb selles, et funktsioonile edastatakse ainult üks märk, mitte terve string. Seega võitsime esimesest näitest viimaseni 25% aega.

Kaasaegne programmeerimine on juba pikka aega edukalt manipuleerinud tüpimata muutujatega. Muutuja tüüpi ei saa eelnevalt määrata ja seda saab muuta programmi täitmise ajal.

See kontseptsioon on muutunud üldise programmeerimisparadigma keskseks. Programmeerimisajastu alguses nõudsid sama põhjaliku enesekindlusega keeled programmeerijalt muutujate eelmääratlemist ja tagasid rangelt, et neile ei määratud midagi ebaseaduslikku. Ei programmidel ega programmeerimiskeeltel polnud varem aimugi, et muutuja oma tüüpi muudab.

Tühjast ja olematust

PHP tühi() funktsioon on funktsiooni isset() pöördväärtus ja sellel on mõned erilised kasutusfunktsioonid. Kui muutujat pole, vastab esimene funktsioon positiivselt ja selle tulemus on tõene, teine ​​aga negatiivselt, st selle väärtus on väär.

Definitsiooni järgi on isset() mõeldud muutuja olemasolu kontrollimiseks. Pole tähtis, mis ja kuidas muutuja määrati, peaasi, et see oleks olemas ja seda ei hävita funktsioon unset(). Funktsiooni isset() tulemus on positiivne – tõene. Oluline on meeles pidada, et kui $iVar = 0; siis isset($iVar) on tõene, kuid tühi($iVar) on samuti tõene.

Esimesel juhul tähendab tulemus muutuja olemasolu, teisel juhul on muutuja tühi, st väärtus "0" mis tahes kujul, olgu see siis string ("0") või arv (murd- 0,0 või täisarv – 0) on sama: tühi ($iVar) on tõene.

Turvalisuse ja kontrolli kohta

Praktika näitab, et trükkimata keeled annavad programmeerijale palju rohkem vabadust, kuid eeldame, et tema suhtumine algoritmi kallal töötamisse on vastutustundlikum.

PHP pakub kaasaegset süntaksit, mis toetab väljakujunenud semantikat, sisaldab vähe vigu, kuid nõuab hoolikat tähelepanu. Näiteks mis tahes funktsiooni kutsumine nõuab teatud arvu parameetreid.

Funktsiooni kutsumisel pole vaja kõiki parameetreid edastada, saate edastada ainult olulise osa neist. Funktsioon "peab" kontrollib kõigi parameetrite olemasolu ja olemasolu. Need, mis puuduvad või millel on valed väärtused, tuleb taastada normaalkujul ja määrata vajalikud väärtused.

Selles kontekstis on PHP tühi() funktsioon hädavajalik. Väljend:

$a = "1;2" + 20

määrab muutujale $a väärtuse 21, kuna avaldise esimene osa on 1 ja teine ​​20.

Tulemuseks on tüüp number ja PHP funktsioon tühi($a) annab tulemuse - false, st muutuja $a ei ole tühi.

Selles kontekstis on funktsioon:

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

Helistades:

$res = funcTest($aVal, $bVal)

sellel on soovitud, see tähendab funktsiooni tulemus. Ja kui kutsutakse:

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

Funktsiooni keha sisaldab ainult ühte parameetrit väärtusega "$aVal . $bVal" ja tõenäoliselt tõlgendatakse seda parameetrit märgijadana.

PHP tühi() objektide ja massiivide jaoks

Keele süntaksis on objektide ja massiividega töötamiseks piisav hulk konstruktsioone ja funktsioone, kuid nende olemasolu ja väärtuse olemasolu kontrollimise seisukohalt muutujatest erilisi erinevusi ei ole.

PHP tühi (massiiv) – samaväärne tühja kutsumisega (lihtne muutuja). Siiski on objektide osas väga olulisi kaalutlusi. Mis puutub objekti olemasolu (isseti) kontrollimisse, siis sellel küsimusel on vaevalt mõtet. Mis puutub PHP tühja() funktsiooni, siis selle kasutamise otstarbekus jääb küsitavaks.

Objektorienteeritud programmeerimise loogika kohaselt on objektil oma sisu ja oma meetodite komplekt. Ainult objekt ise saab öelda, kas see on tühi või mitte, kuid mitte kolmanda osapoole funktsioon, isegi kui see on osa keele süntaksist.

Objekt ja selle funktsioon tühi ()

Sellel lihtsal, kuid õiguspärasel alusel tuleks iga objekti vaadelda selle "tühjuse" mõistmise kontekstis. Näiteks objekti "Personali tabel" rakendamine koosneb kirjetest "Töötaja". Kuid kui pole ühtegi töötajat, siis on "Personali nimekirjas" alati valikud potentsiaalsete töötajate ametikohtade jaoks.

Millisel tasemel peaksin siin kasutama PHP tühja objekti funktsiooni? "Personali" tasemel on kõik olemas, isegi kui pole ühtegi töötajat. "Töötaja" tasemel on objekt juba olemas, isegi kui see pole täielikult täidetud. Mittetäielikult täidetud objekti võib liigitada tühjaks objektiks. Personalitabelisse sellest kasu pole.

Olenevalt programmeerimisstiilist on PHP funktsioonid empty() ja isset() väga olulised turvalise ja töökindla algoritmi koostamiseks, kuid objektide puhul on siiski parem, kui selle sisu järgi on määratletud tühja() variant.