Diskuze: Rozdíl mezi isset a empty
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
php.net/isset | php.net/empty | php.net/language.types.boolean.php
isset zjistuje, zda promenna existuje
empty = isset + var!=false
"empty() is essentially the concise equivalent to !isset($var) || $var == false."
When converting to bool, the following values are considered false:
the boolean false itself
the integer 0 (zero)
the floats 0.0 and -0.0 (zero)
the empty string "", and the string "0"
an array with zero elements
the special type NULL (including unset variables)
SimpleXML objects created from attributeless empty elements, i.e. elements which have neither children nor attributes.
Cili, empty bys mel pouzit v pripade, ze vis, co dela, ze chces presne dosahnout toho, aby var nebyla empty.
U vetsiny app pracujes s db, tam je id radku autoincrement, min hodnota je 1.
Lze tedy pouzit empty.
Ale, v okamziku, kdy potrebujes ukladat treba i prazdne hodnoty "", tak se ti to
nehodi.
Nebo, pokud potrebujes pouze overit existenci hodnoty, obvykle $_POST, $_GET,
$_REQUEST nebo $_SESSION, tak pouzijes isset.
Proste, musis vedet, co delas, ceho chces docilit a podle toho si vyberes
vhodnou funkci. Pokud teda vis, co ty funkce delaji
Kdyz nevis, pouzij radeji isset a zvlast si porovnavej $var!=="" &&
$var!==0.
A ano, u vetsiny prikladu a app najdes pouzite empty(). Ale, bud vi, co
delaji, nebo z 80% to psal nejaky nouma, co to obslohl z examplu a nahodou mu to
fungovalo pro vsechny jeho pripady, na ktere to testoval. A kdyz ne, tak to
povazoval za bezvyznamny bug
Jinak, velke firmy pouzivaji jiny jazyk nez php. Mne je sice sympaticke, ale
kdyz je problem najit dobre placenou praci s primerenou pracovni zatezi, tak to
asi neni uplne ono.
$olej = 1;
if (empty($olej)){
echo "Proměnná je prázdná.";
}
else{
echo "Proměnná není prázdná a má hodnotu:".$olej;
}
echo "<br>";
$motor = 1;
if (isset($motor)){
echo "Proměnná je nastavnena a má hodnotu:".$motor;
}
else{
echo "Proměnná neni nastavena";
}
Díky za vysvětlení, ale když to porovnám k tomuto příkazu. Tak mi to přijde velmi podobné.
A ted tam del olej a motor = 0 nebo "". Rekneme, ze mas 2 policka, kde jedno musis vyplnit a druhe je description, ktere muze zustat prazdne.V tom pripade ti to pres empty neprojde, jako ok. Nicmene, to muze byt take tvuj zamer, protoze to vyresi dalsi kod, nejak.
Peter to napsal správně, ale ještě to shrnu:
isset(), jak vyplývá z názvu (Is set? – Je nastaven?), zjišťuje, zdali daná proměnná je nastavena, tj. jestli existuje. Vůbec ho nezajímá, jaká je v ní hodnota (s výjimkou null).
empty() zjišťuje, jestli proměnná neexistuje nebo je její hodnota false. Je to vlastně zkratka pro (!isset($var) || $var == false). Používá se místo ($var == false) ve chvíli, kdy si nejseš jistý, zdali $var existuje. Velmi často se používá také její negace !empty(), kde zjišťuješ, zda-li proměnná existuje a je true.
Pozor na to, že v PHP se za false považuje několik hodnot, konkrétně to je:
vše ostatní je bráno jako true. (Doufám, že jsem na nic nezapomněl )
Tvůj příklad je poměrně nešikovný, protože na něm rozdíl není vůbec vidět.
$foo = 1;
$bar = 0;
isset($foo); // je true, protože proměnná foo existuje – byla deklarována na řádku 1
isset($bar) // je true, protože proměnná bar existuje – byla deklarována na řádku 2
isset($baz) // je false, protože proměnná baz neexistuje – nebyla deklarována
empty($foo); // je false, protože proměnná foo není false – obsahuje číslici 1
empty($bar) // je true, protože proměnná bar je false – obsahuje číslici 0
empty($baz) // je true, protože proměnná baz neexistuje – nebyla deklarována
($foo == false); // je false, protože proměnná foo není false – obsahuje číslici 1
($bar == false); // je true, protože proměnná bar je false – obsahuje číslici 0
($baz == false); // vyhodí varování "Notice: Undefined variable", protože proměnná baz neexistuje
Pozn. Od PHP 7 existuje ještě tzv. null coalesce operator ??, který
lze použít místo isset() – je to moc šikovné, ale je to vlastně jen
jiný zápis pro isset() a podmínku (resp. ternary operator), teď ti s tím
nebudu motat hlavu, ale až pochopíš isset(), tak se na to mrkni
Upravil bych to jeste takto
<?php
error_reporting(E_ALL);
$foo = 1;
$bar = 0; // $bar = false; $bar = ""; $bar = "0"; ...
//$baZ
echo '<pre>';
var_dump(
isset($foo), // je true, protože proměnná foo existuje – byla deklarována na řádku 1
isset($bar), // je true, protože proměnná bar existuje – byla deklarována na řádku 2
isset($baZ), // je false, protože proměnná baz neexistuje – nebyla deklarována
'---',
empty($foo), // je false, protože proměnná foo není false – obsahuje číslici 1
empty($bar), // je true, protože proměnná bar je false – obsahuje číslici 0
empty($baZ), // je true, protože proměnná baz neexistuje – nebyla deklarována
'---',
($foo == false), // je false, protože proměnná foo není false – obsahuje číslici 1
($bar == false), // je true, protože proměnná bar je false – obsahuje číslici 0
($baZ == false) // vyhodí varování "Notice: Undefined variable", protože proměnná baz neexistuje
);
echo '</pre>';
?>
a vypise to...
( ! ) Notice: Undefined variable: baZ in C:\xampp\htdocs\www\test-isset-empty.php on line 21
Call Stack
# Time Memory Function Location
1 0.1977 392144 {main}( ) ...\test-isset-empty.php:0
C:\xampp\htdocs\www\test-isset-empty.php:21:boolean true
C:\xampp\htdocs\www\test-isset-empty.php:21:boolean true
C:\xampp\htdocs\www\test-isset-empty.php:21:boolean false
C:\xampp\htdocs\www\test-isset-empty.php:21:string '---' (length=3)
C:\xampp\htdocs\www\test-isset-empty.php:21:boolean false
C:\xampp\htdocs\www\test-isset-empty.php:21:boolean true
C:\xampp\htdocs\www\test-isset-empty.php:21:boolean true
C:\xampp\htdocs\www\test-isset-empty.php:21:string '---' (length=3)
C:\xampp\htdocs\www\test-isset-empty.php:21:boolean false
C:\xampp\htdocs\www\test-isset-empty.php:21:boolean true
C:\xampp\htdocs\www\test-isset-empty.php:21:boolean true
Zobrazeno 7 zpráv z 7.