2. diel - Tipy pre začiatočníkov v PHP
Vitajte v 2. diele série Tipy pre začiatočníkov v PHP. Dozviete sa, ako sa vyhodnocujú podmienky, zistíte rozdiel medzi hodnotou NULL v PHP a SQL, naučíte sa dvoma spôsobmi pretypovať premennú, neurobíte chybu pri výpise prvku poľa a možno skrátite časť svojho zdrojového kódu.
Vyhodnotenie podmienky
Pre začiatok je dôležité vedieť, čo je to výraz (expression) a čo príkaz (statement). Výraz môže byť napríklad nejaká matematická operácia. U neho možno vždy vyhodnotiť, či je pravdivý alebo nepravdivý (TRUE / FALSE). Jednoduchým výrazom môže byť napríklad súčet dvoch premenných:
$a + $b
code
Ak chceme u výrazu zistiť jeho pravdivostnú hodnotu, využíva sa predovšetkým konštrukciou, kde je nejaká podmienka (if, ElseIf, while, switch atp.).
Na rozdiel od toho je príkaz niečo, čo sa má vykonať. Napríklad 'ulož
do premennej túto hodnotu'. Na konci každého príkazu je bodkočiarka.
Niektorí začiatočníci v jazyku PHP si tieto dva pojmy pletú a niekedy na
bodkočiarku zabúdajú, alebo ho naopak napíšu tam, kam nemajú.
$vysledek = $a + $b
je výraz, zatiaľ čo
$vysledek = $a + $b;
je príkaz.
Do podmienok sa vždy zadáva výraz (ak by ste sa pokúsili odovzdať príkaz, skončilo by to chybou). Vždy sa vyhodnocuje, či je zadaný výraz pravdivý. Inými slovami, či sa výraz rovná pravdivostná hodnote TRUE.
Znamená to, že miesto:
if ($vyraz == true)
code
stačí zapísať len:
if ($vyraz)
code
Niektorí začínajúci programátori si to príliš neuvedomujú, ale napríklad vie, že pri negáciu možno zapísať iba:
if (!$vyraz)
code
namiesto zápisu vrátane == true
. Ide o ten istý prípad.
Iným prípadom ale je, keď nechceme testovať len hodnotu výrazu, ale aj jeho dátový typ. Podmienky automaticky prevádza dátový typ výrazu na pravdivostnú hodnotu (tj. TRUE / FALSE). Znamená to, že ak podmienke odovzdáme treba nejaký reťazec, prevedie ho. My ale môžeme v určitých prípadoch chcieť porovnávať bez prevodu hodnoty, preto sa používajú tri rovná sa (tzv. Operátor identity).
$retezec = "cokoli"; // všimněte si, že je to řetězec, ne pravdivostní hodnota if ($retezec == true) { // nebo stačí jen if ($retezec) // tato podmínka projde, protože neprázdný řetězec PHP převede na true. Kdyby byl prázdný, neprovedla by se } if ($retezec === true) { // tato podmínka neprojde, protože datové typy nepřevádíme }
code
Výrazom nemusí byť len jedna hodnota. Výrazom môže byť aj celá matematická operácia, napríklad sčítanie. V takýchto prípadoch sa väčšinou testuje, či je hodnota naľavo napríklad väčšia ako hodnota napravo. To celé je ale stále jeden výraz, ktorý sa vyhodnotí (či je pravdivé alebo nepravdivé) a podľa toho sa rozhodne, či sa spustí kód.
$a = 5; $b = 10; if ($a + $b > 20) { // kód se logicky nespustí, protože 5 + 10 není větší než 20 a výraz je FALSE }
code
Aj tento príklad je skrátený. Pokiaľ si výraz uložíme do premennej,
dostaneme sa späť na začiatok - nemusíme uvádzať == true
$a = 5; $b = 10; $vysledek = $a + $b > 20; if ($vysledek) { // kód }
code
Je možnosť vyhodnotiť podmienku a zároveň do premennej uložiť hodnotu. Musíme ale výraz obaliť zátvorkami.
$a = 5; $b = 10; if ($vysledek = $a + $b > 2)
code
Tu sa do premennej $ vysledok uloží až výsledok celého výrazu '$ a + $ b> 2', čo bude TRUE. My ale chceme uložiť do premennej výsledok súčtu. Využijeme na to zátvorky:
$a = 5; $b = 10; if (($vysledek = $a + $b) > 2) { echo $vysledek; // vypíše 15 }
code
Teraz sa prvýkrát uloží do premennej výsledok súčtu a až potom sa vyhodnotí, či je to vyšší ako 2. Znamená to teda, že premenná $ vysledok obsahuje číslo 15 a môžeme s ňou v bloku pracovať.
Rozdiel medzi NULL v PHP a SQL
Oba jazyky obsahujú dátový typ NULL. V oboch jazykoch ale funguje trochu inak. V PHP znamená 'prázdny', zatiaľ čo v SQL znamená 'neznámy'.
V PHP sa výraz:
NULL == NULL
code
vyhodnotí ako pravdivý, pretože prázdna hodnota sa rovná prázdne hodnote.
V SQL sa ale tento výraz správa inak. Výsledkom je opäť NULL, pretože rovná sa neznáma hodnota inej nepoznáme hodnote? To nevieme, preto nie je možné určiť, či je to TRUE alebo FALSE. Z toho dôvodu výsledkom je opäť 'neznáma hodnota', čiže NULL.
Pretypovanie premenných
Pretypovanie premenné inými slovami znamená zmeniť jej dátový typ. Často sa pretypovanie používa napríklad u databázových dotazov, kedy hľadáme podľa určitého ID. Pretypovať možno dvoma spôsobmi:
Použitím funkcie
K tomu slúži funkcia settype (). Prvým parametrom je premenná, ktorá má byť pretypovaná, a druhý je dátový typ. Ten môže nadobúdať hodnoty boolean (skrátene bool), integer (skrátene int), float, string, array, object, null.
$cislo = 1; $pravdivostniHodnota = settype($cislo, "bool"); // $cislo je nyní TRUE $cislo = 0; $pravdivostniHodnota = settype($cislo, "bool"); // $cislo je nyní FALSE
code
Ak by sme naopak chceli zistiť dátový typ premennej, použijeme na to funkciu gettype ().
$cislo = 1; echo gettype($cislo); // integer
code
Použitie zátvorky pred výrazom
Namiesto funkcií sa častejšie používa aj kratšie zápis s pomocou zátvoriek pred výrazom.
$cislo = 1; $pravdivostniHodnota = (bool) $cislo;
code
Ako bolo napísané vyššie, pretypovanie sa často používa napríklad u databázových dotazov, kde hľadáme podľa určitého ID. Aby sme si boli istí, že do databázového dopytu určite odovzdávame číslo, možno vstupnú hodnotu pretypovať.
$id = (int) $_GET["id"];
code
Teraz sa nemusíme báť, že by v premennej $ id bolo niečo iné ako číslo.
Niekedy sa pretypovanie používa aj kvôli jednoduchšiemu zápisu pri manipulácii s objektom miesto poľom.
$pole = array("klic" => "hodnota"); echo $pole["klic"]; // musíme psát závorky, v některých případech i uvozovky...
code
Pri objekte stačí napísať iba šípku. Ak v PHP přetypujeme poľa na objekt, automaticky sa vytvorí objekt triedy stdClass, kde sú vlastnosti ako kľúče poľa.
$pole = array("klic" => "hodnota"); $objekt = (object) $pole; echo $objekt->klic; // lze ale přetypovat i rovnou při vytváření pole $objekt = (object) array( "klic_1" => "hodnota", "klic_2" => "hodnota" )
code
Vypísanie prvku poľa
Ak ste sa s dátovým typom 'pole' už stretli, určite viete, že sa k jeho prvku dostanete pomocou kľúča.
$pole = array("klic" => "hodnota"); echo $pole["klic"]; // vypíše 'hodnota'
code
V takom prípade ale môže dôjsť k chybe, ak sa pokúsime hodnotu prvku vypísať v reťazci.
echo "řetězec včetně $pole["prvek"] nějakého prvku v poli.";
code
V tomto príklade sa stane, že sa ukončí reťazec hneď za prvú hranatou zátvorkou. Po ňom bude nasledovať sada znakov, ktorým PHP nerozumie a preto vyhodí chybu. Máme hneď niekoľko spôsobov, ako sa chyby vyvarovať.
// použití apostrofů pro klíč echo "řetězec včetně $pole['prvek'] nějakého prvku v poli."; // ukončení řetězce echo "řetězec včetně " . $pole["prvek"] . " nějakého prvku v poli."; // použití svorek (tento způsob se mi zdá nejlepší) echo "řetězec včetně {$pole["prvek"]} nějakého prvku v poli.";
code
Existuje ešte jedna možnosť a to úvodzovky a apostrofy úplne vynechať.
echo "řetězec včetně $pole[prvek] nějakého prvku v poli.";
code
Tento spôsob ale neodporúčam začiatočníkom, pretože funguje len v reťazci. Ak by sme sa pokúsili vypísať hodnotu samostatne:
echo $pole[prvek];
code
tak skončí zápis chybou, pretože sa PHP bude snažiť dosadiť hodnotu konštanty, ktorá neexistuje.
Návrat pravdivostná hodnoty z funkcie
Vďaka tomu, že sa po príkaze return nespracováva ďalší kód, môžeme vynechať niekedy aj niekoľko riadkov. Ukážme si jednoduchý príklad:
function vetsiNez($a, $b) { $jeVetsi = $a > $b; if ($jeVetsi) { return TRUE; } else { return FALSE; } }
code
Vyššie je primitívne funkcie, ktorá zistí, či je hodnota prvého parametra väčšia než hodnota druhého. Podľa toho vráti TRUE alebo FALSE. Telo tejto funkcie možno však skrátiť na jeden riadok. Ako?
A) Vyhodiť else
Vďaka tomu, že sa po príkaze return nespracováva žiadny kód, môžeme else vyhodiť.
function vetsiNez($a, $b) { $jeVetsi = $a > $b; if ($jeVetsi) { return TRUE; } return FALSE; }
code
Ak sa podmienka splní, vráti sa TRUE a ďalšie kód neprebehne.
B) Vyhodiť if
Keďže máme výsledok výrazu uložený v premennej $ jeVetsi, môžeme zahodiť aj podmienku if.
function vetsiNez($a, $b) { $jeVetsi = $a > $b; return $jeVetsi; }
code
C) Vyhodiť premennú
Daný výraz vôbec nie je potreba ukladať do premennej a jeho výsledok môžeme rovno vrátiť.
function vetsiNez($a, $b) { return $a > $b; }
code
Pozn .: Jedná sa len o príklad toho, ako možno daný kód skrátiť, taká funkcia by bola zbytočná.
Uloženie pravdivostná hodnoty do premennej
Ide o veľmi podobný prípad ako u predchádzajúceho príkladu. Jednoduchá ukážka:
if ($a + $b > 10) { $vysledek = TRUE; } else { $vysledek = FALSE; }
code
Tento kód možno taky skrátiť na jeden riadok. Môžeme k tomu využiť napríklad ternárne operátor.
$vysledek = $a + $b > 10 ? TRUE : FALSE;
code
Ternárne operátor zistí pravdivostnú hodnotu výrazu a ak je pravdivá, použije sa výraz za otáznikom. Naopak ak nie je pravdivá, použije sa výraz za dvojbodkou. Ak je výsledným výrazom pravdivostná hodnota, môžeme výraz za otáznikom vynechať.
$vysledek = $a + $b > 10 ?: FALSE;
code
Pri tomto príklade možno ale sazmořejmě vynechať aj samotný ternárne operátor.
$vysledek = $a + $b > 10;
code
To je z druhého dielu všetko. Budúci diel bude zameraný skôr na prácu s dátami z databázy - ako znížiť záťaž a ako prenášať len tie dáta, ktorá naozaj potrebujeme.