empty és null
Az empty és a null két különböző adattípus. Ebben a posztban bemutatom, hogy melyik mit jelent, mert sokan azt hiszik, hogy a kettő egy és ugyanaz. Pedig nem.
A kérdést nem is könnyű megválaszolni. PHP-ben a null jelentése semmi. Szó szerint semmi. Ha egy változónak az értéke null, akkor egyáltalán nincs értéke. Tehát, nem nulla, nem üres string, hanem semmi.
Ezzel szemben az empty egy "üres" változó, van értéke. Üres változók:
- "" (egy üres string)
- 0 (0 mint egész szám)
- 0.0 (0 mint lebegőpontos)
- "0" (0 mint szöveg)
- null
- false
- array() (üres tömb)
- $var; (létrehozunk egy változót, de nem adunk neki értéket)
Ahogy láthatjuk, ha egy változó értéke semmi, azaz null, a PHP azt is empty értékként használja. Innen fakad a keveredés, de a két dolog akkor sem ugyanaz.
Jöjjenek a példák, hogy lássuk a különbséget. A példában három változót fogunk használni.
Az elsőnek null értéket adunk, a másodiknak egy üres stringet, míg a harmadikat nem hozzuk létre. Az eddigi posztokban többször is használtuk az isset függvényt, most lássuk, mit szól a három változónkhoz:
<?php
$valtozo1 = null;
$valtozo2 = "";
if (isset($valtozo1)) {
echo '$valtozo1 létezik.' . '<br />';
} else {
echo '$valtozo1 nem létezik.' . '<br />';
}
if (isset($valtozo2)) {
echo '$valtozo2 létezik.' . '<br />';
} else {
echo '$valtozo2 nem létezik.' . '<br />';
}
if (isset($valtozo3)) {
echo '$valtozo3 létezik.' . '<br />';
} else {
echo '$valtozo3 nem létezik.' . '<br />';
}
?>
Az eredmény:
$valtozo1 nem létezik.
$valtozo2 létezik.
$valtozo3 nem létezik.
Jól látszik, hogy a null értékű változó ugyanúgy viselkedik, mint egy nem deklarált. Tehát, ha azt akarjuk, hogy egy változó "ne legyen" többé, állítsuk az értékét null-ra.
De! A null értékű változó valójában létezik, a PHP úgynevezett szimbólumtáblájában. Csak az értéke semmi. Ezzel szemben, a létre nem hozott változó valóban nem létezik egyáltalán. Ha egy változót ténylegesen szeretnénk eltávolítani, használjuk az unset() függvényt.
unset($valtozo1);
Melyik jobb, ha egy változónak null értéket adunk, vagy ténylegesen eltávolítjuk az unset() függvénnyel? A null érték adás egy kicsivel gyorsabb, mint az unset() függvény. Nagy forgalmú weboldalaknál ezért szerintem, a null érték ésszerűbb választás.
A következő, amit megvizsgálunk, hogy az adott változó értéke null, vagy nem null. Ehhez a beépített is_null() függvényt használjuk, amely logikai formában visszaadja ezt. Lássuk, mit szól a három változónkhoz:
<?php
$valtozo1 = null;
$valtozo2 = "";
if (is_null($valtozo1)) {
echo 'A $valtozo1 értéke null.' . '<br />';
} else {
echo 'A $valtozo1 értéke nem null.' . '<br />';
}
if (is_null($valtozo2)) {
echo 'A $valtozo2 értéke null.' . '<br />';
} else {
echo 'A $valtozo2 értéke nem null.' . '<br />';
}
if (is_null($valtozo3)) {
echo 'A $valtozo3 értéke null.' . '<br />';
} else {
echo 'A $valtozo3 értéke nem null.' . '<br />';
}
?>
Az eredmény:
A $valtozo1 értéke null.
A $valtozo2 értéke nem null.
Notice: Undefined variable: valtozo3 in /blog/null.php on line 27
A $valtozo3 értéke null.
Amint láthatjuk, a PHP figyelmeztet minket, hogy a $valtozo3 nem létezik, bár az értékét null-nak veszi. És ahogy várható volt, a $valtozo1 null értéket képvisel, a $valtozo2 pedig nem.
Előfordulhat, főleg ha béreljük a tárhelyünket, hogy a $valtozo3 hiányára nem figyelmeztet a program. Ennek oka, hogy a PHP konfigurációs fájljában ki van kapcsolva a figyelmeztetés. Ha szeretnénk mégis látni, egyszerűen kezdjük így a programunkat:
<?php
ini_set('display_errors', 1);
A fenti sor felülbírálja a beállítást, és megjelenik a változó hiányáról a figyelmeztetés.
Végül még egy vizsgálatnak vetjük alá a változóinkat, megnézzük, hogy a PHP üres változónak tekinti-e őket. Ehhez az empty() függvény lesz a segítségünkre, amely szintén logikai értékként adja vissza a vizsgálat eredményét:
<?php
ini_set('display_errors', 1);
$valtozo1 = null;
$valtozo2 = "";
if (empty($valtozo1)) {
echo 'A $valtozo1 értéke üres.' . '<br />';
} else {
echo 'A $valtozo1 értéke nem üres.' . '<br />';
}
if (empty($valtozo2)) {
echo 'A $valtozo2 értéke üres.' . '<br />';
} else {
echo 'A $valtozo2 értéke nem üres.' . '<br />';
}
if (empty($valtozo3)) {
echo 'A $valtozo3 értéke üres.' . '<br />';
} else {
echo 'A $valtozo3 értéke nem üres.' . '<br />';
}
?>
Eredmény:
A $valtozo1 értéke üres.
A $valtozo2 értéke üres.
A $valtozo3 értéke üres.
Eredményül mind a három változó üres értéket mutat. Az első kettőt nem kell magyaráznom, hisz a cikk elején már leírtam, hogy a PHP az üres string-et és a null értéket is üresnek tekinti. Viszont, jegyezzük meg, hogy a létre nem hozott változót is üresnek tekinti a PHP.
És végül egy megjegyzés. Ha megfigyeltük, mind az isset() és mind az empty() nem figyelmeztet rá, ha egy változó nem létezik. A későbbi hibák elkerülése érdekében ezt jegyezzük meg.