IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Kamil
Člen
Avatar
Kamil:29.5.2021 19:41

Ahoj,

rád bych se zeptal, jaký je rozdíl mezi funkcí isset a empty? Co znamená, že je proměnná nastavena? Chápu, že empty zkoumá, že jestli proměnná je prázdná a nebo jestli existuje, ale funkce isset mi nějak uniká.

Díky.

 
Odpovědět
29.5.2021 19:41
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.5.2021 9:43
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.

Editováno 30.5.2021 9:44
 
Nahoru Odpovědět
30.5.2021 9:43
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.5.2021 9:51

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.

 
Nahoru Odpovědět
30.5.2021 9:51
Avatar
Kamil
Člen
Avatar
Odpovídá na Peter Mlich
Kamil:30.5.2021 10:16
$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é.

 
Nahoru Odpovědět
30.5.2021 10:16
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:30.5.2021 18:55

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.

 
Nahoru Odpovědět
30.5.2021 18:55
Avatar
Jan Kerhart
Člen
Avatar
Jan Kerhart:30.5.2021 22:54

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:

  • sama hodnota false (bool)
  • hodnota null
  • číslo 0 (int i float)
  • prázdný string
  • prázdné pole
  • a pozor, i string obsahující: "0"

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 :)

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
30.5.2021 22:54
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:31.5.2021 7:47

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
 
Nahoru Odpovědět
31.5.2021 7:47
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.