2. díl - Tipy pro začátečníky v PHP

PHP Tipy pro začátečníky Tipy pro začátečníky v PHP

Vítejte ve 2. díle série Tipy pro začátečníky v PHP. Dozvíte se, jak se vyhodnocují podmínky, zjistíte rozdíl mezi hodnotou NULL v PHP a SQL, naučíte se dvěma způsoby přetypovat proměnnou, neuděláte chybu při výpisu prvku pole a možná zkrátíte část svého zdrojového kódu. :-)

Vyhodnocení podmínky

Pro začátek je důležité vědět, co je to výraz (expression) a co příkaz (statement). Výraz může být například nějaká matematická operace. U něj lze vždy vyhodnotit, zda je pravdivý nebo nepravdivý (TRUE / FALSE). Jednoduchým výrazem může být například součet dvou proměnných:

$a + $b

Pokud chceme u výrazu zjistit jeho pravdivostní hodnotu, využívá se především konstrukcí, kde je nějaká podmínka (if, elseif, while, switch atp.).

Na rozdíl od toho je příkaz něco, co se má provést. Například 'ulož do proměnné tuto hodnotu'. Na konci každého příkazu je středník. Někteří začátečníci v jazyce PHP si tyto dva pojmy pletou a někdy na středník zapomínají, nebo ho naopak napíší tam, kam nemají. $vysledek = $a + $b je výraz, zatímco $vysledek = $a + $b; je příkaz.

Do podmínek se vždy zadává výraz (pokud byste se pokusili předat příkaz, skončilo by to chybou). Vždy se vyhodnocuje, zda je zadaný výraz pravdivý. Jinými slovy, jestli se výraz rovná pravdivostní hodnotě TRUE.

Znamená to, že místo:

if ($vyraz == true)

stačí zapsat pouze:

if ($vyraz)

Někteří začínající programátoři si to příliš neuvědomují, ale například ví, že při negaci lze zapsat pouze:

if (!$vyraz)

namísto zápisu včetně == true. Jde o ten stejný případ.

Jiným případem ale je, když nechceme testovat pouze hodnotu výrazu, ale i jeho datový typ. Podmínky automaticky převádí datový typ výrazu na pravdivostní hodnotu (tj. TRUE / FALSE). Znamená to, že pokud podmínce předáme třeba nějaký řetězec, převede ho. My ale můžeme v určitých případech chtít porovnávat bez převodu hodnoty, proto se používají tři rovnítka (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
}

Výrazem nemusí být pouze jedna hodnota. Výrazem může být i celá matematická operace, například sčítání. V takových případech se většinou testuje, zda je hodnota nalevo například větší než hodnota napravo. To celé je ale stále jeden výraz, který se vyhodnotí (zda je pravdivý či nepravdivý) a dle toho se rozhodne, zda se 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
}

I tento příklad je zkrácen. Pokud si výraz uložíme do proměnné, dostaneme se zpět na začátek - nemusíme uvádět == true

$a = 5;
$b = 10;
$vysledek = $a + $b > 20;

if ($vysledek) {
  // kód
}

Je možnost vyhodnotit podmínku a zároveň do proměnné uložit hodnotu. Musíme ale výraz obalit závorkami.

$a = 5;
$b = 10;
if ($vysledek = $a + $b > 2)

Zde se do proměnné $vysledek uloží až výsledek celého výrazu '$a + $b > 2', což bude TRUE. My ale chceme uložit do proměnné výsledek součtu. Využijeme k tomu závorky:

$a = 5;
$b = 10;
if (($vysledek = $a + $b) > 2) {
  echo $vysledek;  // vypíše 15
}

Nyní se prvně uloží do proměnné výsledek součtu a až potom se vyhodnotí, zda je to vyšší než 2. Znamená to tedy, že proměnná $vysledek obsahuje číslo 15 a můžeme s ní v bloku pracovat.

Rozdíl mezi NULL v PHP a SQL

Oba jazyky obsahují datový typ NULL. V obou jazycích ale funguje trochu jinak. V PHP znamená 'prázdný', zatímco v SQL znamená 'neznámý'.

V PHP se výraz:

NULL == NULL

vyhodnotí jako pravdivý, protože prázdná hodnota se rovná prázdné hodnotě.

V SQL se ale tento výraz chová jinak. Výsledkem je opět NULL, protože rovná se neznámá hodnota jiné neznáme hodnotě? To nevíme, proto nelze určit, zda je to TRUE nebo FALSE. Z toho důvodu výsledkem je opět 'neznámá hodnota', neboli NULL.

Přetypování proměnných

Přetypování proměnné jinými slovy znamená změnit její datový typ. Často se přetypování používá například u databázových dotazů, kdy hledáme podle určitého ID. Přetypovat lze dvěma způsoby:

Použitím funkce

K tomu slouží funkce settype(). Prvním parametrem je proměnná, která má být přetypována, a druhý je datový typ. Ten může nabývat hodnot boolean (zkráceně bool), integer (zkráceně 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

Pokud bychom naopak chtěli zjistit datový typ proměnné, použijeme na to funkci gettype().

$cislo = 1;
echo gettype($cislo);  // integer

Použití závorky před výrazem

Místo funkcí se častěji používá i kratší zápis s pomocí závorek před výrazem.

$cislo = 1;
$pravdivostniHodnota = (bool) $cislo;

Jak bylo psáno výše, přetypování se často používá například u databázových dotazů, kde hledáme podle určitého ID. Abychom si byli jisti, že do databázového dotazu určitě předáváme číslo, lze vstupní hodnotu přetypovat.

$id = (int) $_GET["id"];

Nyní se nemusíme bát, že by v proměnné $id bylo něco jiného než číslo.

Někdy se přetypování používá i kvůli jednoduššímu zápisu při manipulaci s objektem místo polem.

$pole = array("klic" => "hodnota");
echo $pole["klic"];  // musíme psát závorky, v některých případech i uvozovky...

U objektu stačí napsat pouze šipku. Pokud v PHP přetypujeme pole na objekt, automaticky se vytvoří objekt třídy stdClass, kde jsou vlastnosti jako klíče pole.

$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"
)

Vypsání prvku pole

Pokud jste se s datovým typem 'pole' již setkali, určitě víte, že se k jeho prvku dostanete pomocí klíče.

$pole = array("klic" => "hodnota");
echo $pole["klic"];  // vypíše 'hodnota'

V takovém případě ale může dojít k chybě, pokud se pokusíme hodnotu prvku vypsat v řetězci.

echo "řetězec včetně $pole["prvek"] nějakého prvku v poli.";

V tomto příkladu se stane, že se ukončí řetězec hned za první hranatou závorkou. Po něm bude následovat sada znaků, kterým PHP nerozumí a proto vyhodí chybu. Máme hned několik způsobů, jak se chyby vyvarovat.

// 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.";

Existuje ještě jedna možnost a to uvozovky a apostrofy úplně vynechat.

echo "řetězec včetně $pole[prvek] nějakého prvku v poli.";

Tento způsob ale nedoporučuji začátečníkům, protože funguje pouze v řetězci. Pokud bychom se pokusili vypsat hodnotu samostatně:

echo $pole[prvek];

tak skončí zápis chybou, protože se PHP bude snažit dosadit hodnotu konstanty, která neexistuje.

Návrat pravdivostní hodnoty z funkce

Díky tomu, že se po příkazu return nezpracovává další kód, můžeme vynechat někdy i několik řádků. Ukažme si jednoduchý příklad:

function vetsiNez($a, $b)
{
  $jeVetsi = $a > $b;
  if ($jeVetsi) {
    return TRUE;
  } else {
    return FALSE;
  }
}

Výše je primitivní funkce, která zjistí, zda je hodnota prvního parametru větší než hodnota druhého. Dle toho vrátí TRUE nebo FALSE. Tělo této funkce lze však zkrátit na jeden řádek. Jak?

a) Vyhodit else

Díky tomu, že se po příkazu return nezpracovává žádný kód, můžeme else vyhodit.

function vetsiNez($a, $b)
{
  $jeVetsi = $a > $b;
  if ($jeVetsi) {
    return TRUE;
  }

  return FALSE;
}

Pokud se podmínka splní, vrátí se TRUE a další kód neproběhne.

b) Vyhodit if

Jelikož máme výsledek výrazu uložený v proměnné $jeVetsi, můžeme zahodit i podmínku if.

function vetsiNez($a, $b)
{
  $jeVetsi = $a > $b;

  return $jeVetsi;
}

c) Vyhodit proměnnou

Daný výraz vůbec není potřeba ukládat do proměnné a jeho výsledek můžeme rovnou vrátit.

function vetsiNez($a, $b)
{
  return $a > $b;
}

Pozn.: Jedná se pouze o příklad toho, jak lze daný kód zkrátit, taková funkce by byla zbytečná.

Uložení pravdivostní hodnoty do proměnné

Jde o velmi podobný případ jako u předchozího příkladu. Jednoduchá ukázka:

if ($a + $b > 10) {
  $vysledek = TRUE;
} else {
  $vysledek = FALSE;
}

Tento kód lze taky zkrátit na jeden řádek. Můžeme k tomu využít například ternární operátor.

$vysledek = $a + $b > 10 ? TRUE : FALSE;

Ternární operátor zjistí pravdivostní hodnotu výrazu a pokud je pravdivá, použije se výraz za otazníkem. Naopak pokud není pravdivá, použije se výraz za dvojtečkou. Pokud je výsledným výrazem pravdivostní hodnota, můžeme výraz za otazníkem vynechat.

$vysledek = $a + $b > 10 ?: FALSE;

U tohoto příkladu lze ale sazmořejmě vynechat i samotný ternární operátor.

$vysledek = $a + $b > 10;

To je z druhého dílu vše. Příští díl bude zaměřen spíše na práci s daty z databáze - jak snížit zátěž a jak přenášet jen ta data, která opravdu potřebujeme.


 

  Aktivity (1)

Článek pro vás napsal Martin Konečný (pavelco1998)
Avatar
Autor se o IT moc nezajímá, raději by se věnoval speciálním jednotkám jako jsou SEALs nebo SAS. Když už to ale musí být něco z IT, tak tvorba web. aplikací v PHP.

Jak se ti líbí článek?
Celkem (9 hlasů) :
55555


 


Miniatura
Předchozí článek
Tipy pro začátečníky v PHP
Miniatura
Všechny články v sekci
Tipy pro začátečníky v PHP
Miniatura
Následující článek
Tipy pro začátečníky v PHP

 

 

Komentáře

Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Matúš Petrofčík:

"rozdíl mezi hodnotou NULL v PHP a SQL"... dosť dôležité vedieť :)

Pekné články, čítal si nejakú knihu v poslednej dobe? :)

Odpovědět 29.1.2015 17:32
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovídá na Matúš Petrofčík
Martin Konečný (pavelco1998):

Jednu jedinou knihu, kterou jsem pročítal, byla 1001 tipů a triků pro PHP od pana Vrány. V životě jsem jinou (vyjma 1. třídy ZŠ) knihu nikdy nečetl :D

 
Odpovědět 29.1.2015 18:02
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Matúš Petrofčík:

Presne na túto som myslel :D Keď som ju čítal, tak ma napadlo napísať podobné články (ale len pre seba, a ani to sa mi už dáko nechce). Tú som tiež prečítal celú + porobil si na lístok poznámky, ktoré tipy musím zrealizovať (naučiť sa). Okrem toho na 50% nejakú knihu o HTML, 1 odbornú o didaktike, a 5 kníh normálnych... som trochu väčší čitateľ :D

Odpovědět 29.1.2015 18:06
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovídá na Matúš Petrofčík
Martin Konečný (pavelco1998):

Nemám rád knihy, povinná četba k maturitě je moje noční můra :D
Já jsem tak polovině věcí z toho moc nerozuměl, ale některé rady byly pěkně sepsané. Četl jsem ji ale tak před dvěma lety, nečerpal jsem od ní přímo.

 
Odpovědět  ±0 29.1.2015 18:10
Avatar
Martina Čižinská:

Co použít u vypsání pole prvku v řetězci spíše fci sprintf pro lepší přehlednost? :-)

 
Odpovědět 30.1.2015 7:01
Avatar
Odpovídá na Martina Čižinská
Martin Konečný (pavelco1998):

To jde samozřejmě taky, ale já bych byl líný psát všude k tomu echo ještě funkci. Tento způsob mi přijde nejpřehlednější, pokud použiji pouze echo.

echo "řetězec včetně {$pole["prvek"]} nějakého prvku v poli.";

Ale záleží na každým, jak se mu to zdá nejlepší.

Editováno 30.1.2015 9:25
 
Odpovědět 30.1.2015 9:25
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 6 zpráv z 6.