Studijní portál OA Znojmo
Proměnné patří mezi základní stavební kameny každého programovacího jazyka.
Definice – proměnná je název pro nějaké místo, do kterého pak můžeme dosadit libovolnou hodnotu. Příklad – vytváříte program, ve kterém potřebujete několikrát pracovat s číslem 4000000. Jednoduchým přiřazením tohoto čísla do proměnné (např. s názvem x), již pak v samotném běhu programu používáte pouze název této proměnné:
<?php
$x = 4000000;
//proměnné x jsme přiřadili číslo 4000000
echo $x * 2;
//výsledkem bude číslo 8000000 – tedy 4 miliony krát dvě
?>
V PHP se proměnná značí symbolem dolaru - $ (pravý Alt a ů), za kterým následuje jméno proměnné (např. $pokus představuje proměnnou s názvem pokus). Vkládání hodnot do proměnné se nazývá přiřazování hodnot proměnné. Do proměnné samozřejmě nemusíme vždy přiřazovat pouze číslo. Může to být i libovolný text neboli řetězec:
<?php
$adresa = 'Palackého 125, Nová Paka, 542 12';
//vytvořili jsme proměnnou s názvem adresa, která obsahuje delší text
echo $adresa;
?>
Proměnné se mohou během programu měnit. Tedy např.:
<?php
$adresa = 'Palackého 125, Nová Paka, 542 12';
echo $adresa;
echo '<br />';
//vypíše adresu a zařídí, aby se vše následující vypsalo na nový řádek
$adresa = 'Sokolovská 28, Praha 8, 111 50';
echo $adresa;
echo '<br />';
//vypíše adresu a zařídí, aby se vše následující vypsalo na nový řádek
$adresa = 'Kamenická 85, Písek 5, 245 20';
echo $adresa;
echo '<br />';
//vypíše adresu a zařídí, aby se vše následující vypsalo na nový řádek
?>
Tento příklad vypíše jednotlivé adresy vždy na nový řádek:
Palackého 125, Nová Paka, 542 12 Sokolovská 28, Praha 8, 111 50 Kamenická 85, Písek 5, 245 20
Názvy proměnných
Každá proměnná má svůj název. Můžeme používat písmena a také znak podtržítko (_). Ovšem název nesmí začínat číslicí! PHP je programovacím jazykem, který je tzv. „Case sensitive“, neboli je citlivý na velká či malá písmena. Můžete tedy používat jak malá tak velká písmena, ale pamatujte, že je v každém z nich rozdíl. České znaky lze také používat, ale velmi důrazně se to nedoporučuje. Obecně lze říci, že můžete používat všechny znaky, které mají ASCII hodnotu od 127 do 255 (ASCII je standardizovaný způsob, který přiděluje každému znaku určité číslo – hodnotu ASCII). Používejte pokud možno názvy, které alespoň trochu symbolizují to, co daný skript bude vykonávat nebo daná proměnná obsahuje. V programu se pak budete později lépe orientovat.
Když proměnná neexistuje
Pokud se pokusíte v PHP spustit skript s proměnnou, která neexistuje, mohou nastat dvě varianty možností:
- buď je PHP nastaveno tak, aby vypsalo chybové hlášení (o těchto nastaveních později..)
- je PHP nastaveno tak, že nevypisuje chybové hlášení – pak se nic nevypíše
<?php
$pokus=1;
//vytvořili jsme proměnnou s názvem pokus, která obsahuje číslo 1
echo $pkus;
//zde je napsáno místo pokus pkus, tedy takováto proměnná neexistuje
?>
Pokud je PHP nastaveno na vypisování chybových hlášení v tomto případě vypíše: Notice: Undefined variable: c in C:\wamp\www\index.php on line 4 (cesta je samozřejmě dle daného umístění souboru)
Zrušení proměnné
Pokud jednou proměnné přiřadíte určitou hodnotu, bude tato proměnná existovat až do konce skriptu PHP. To sice nemusí, ale také může vadit. Pokud tedy potřebujeme určitou proměnnou zrušit, použijeme tzv. kontrukci unset, za kterou se do závorek vypíše jméno proměnné, kterou potřebujeme zrušit.
unset ($a)
Příklad:
<?php
$a = 1;
// Proměnná $a teď obsahuje jako hodnotu číslo 1
echo $a;
// Vypíše hodnotu proměnné $a tedy 1
unset($a);
// konstrukce unset zruší proměnnou $a. Tedy nyní již proměnná $a už neexistuje.
echo $a;
// Nyní (pokud je tak PHP nastaveno) vypíše stránka chybu
?>
Proměnné uvnitř řetězce
Následující příklad demonstruje užití vytvořené proměnné uvnitř nějakého textu – řetězce.
<?php
$jmeno = 'Alík';
// Vytvoříme proměnnou $jmeno a dáme jí jako hodnotu řetězec 'Alík'
echo "Můj pes se jmenuje $jmeno";
// Vypíše: Můj pes se jmenuje Alík
?>
Další příklad ukazuje, jak je možné spojit proměnnou s určitým textem:
PHP je benevolentní k umístění znaku dolaru – funguje i varianta, kdy dolar není uvnitř závorek:
echo "Máme doma ${jmeno}a";
Spojování řetězců
Spojování řetězců je vlastně spojování kusů textu. Pro spojování textu se v PHP používá tečka (.), vložená mezi tyto řetězce. Např:
<?php
echo 'a'.'b'.'c';
// vypíše se abc
?>
Podobně můžete spojovat proměnné:
<?php
$znak = 'x';
echo $znak . $znak . $znak;
//Vypíše xxx
?>
Další variantou může být připojování nových hodnot k již vytvořené proměnné:
<?php
$a = '1';
// Proměnná $a obsahuje text: 1
$a .= '2';
// Proměnná $a nyní připojí text: 2
$a .= '3';
// Proměnná $a nyní připojí text: 3
echo $a;
// Nakonec se vypíše: 123
?>
Operace s jednotlivými znaky
Každý řetězec má určitý počet znaků. PHP si jednotlivé znaky umí očíslovat. Příklad:
$a = abcd;
//Pořadí znaků je tedy a=0, b=1, c=2, d=3 atd.
První znak má pořadí 0, druhý 1, třetí 2 atd. Tedy oproti klasickému číslování se u PHP ale i u jiných programovacích jakzyků začíná nulou. Pokud potřebujeme nahradit daný znak z určité proměnné, vypadá to následovně:
<?php
$a = '12345';
$a[2] = 'x';
// znak na pozici 2 v řetězci je přepsán znakem x.
echo $a;
// Vypíše: 12x45
?>
Požadovaná pozice se vkládá do hranatých závorek [ a ] (klávesa pravý Alt+F a pravý Alt+G). Nicméně může se používat také složených závorek – { a } (klávesa pravý Alt+B a pravý Alt+N). Oba zápisy fungují stejně. Ovšem je mezinárodně dohodnuto, že verze PHP 6 bude podporovat již jen první způsob zápisu. Pokud znak neexistuje Pokud program požaduje vypsání znaku na pozici, kde nic není (přesněji řečeno, která neexistuje), nevypisuje se nic nebo chybové hlášení (záleží na nastavení výpisu chyb PHP serveru).
<?php
$a = 'ABCDE';
echo $a[5];
// Pokus o výpis znaku na pozici 5.
// Nevypíše nic nebo chybové hlášení (dle nastavení PHP)
?>
Připsání znaku v případě, že neexistuje znak na dané pozici Pokud se pokusíte změnit znak na neexistující pozici, dojde k připsání tohoto znaku do řetězce:
<?php
$a = 'abcd';
$a[4] = 'x';
// Písmeno x se dopíše na 4, tedy v tomto případě neexistující pozici.
echo $a;
// Vypíše: abcdx
?>
Vyzkoušejte ještě variantu, kdy nebude daná pozice navazovat na řetězec. Např. zadáte pozici 8:
<?php
$a = 'abcd';
$a[8] = 'x';
// Písmeno x chceme vypsat na 8. pozici. 4. až 7. ale neexistuje.
echo $a;
// Vypíše: abcd x. Řetězec prostě vytvoří mezeru
?>
Určení pořadí znaku pomocí proměnné O něco složitěji vypadá následující příklad. Namísto přímého uvedení pořadového čísla znaku je použita proměnná:
<?php
$a = 'ABCDE';
$poradi = 3;
echo $a[$poradi];
// Vypíše znak na pozici 3, tedy D
?>
Řetězce jsou vlastně „kousky textu“. Nebo-li mohou obsahovat cokoliv.
Pro vypsání nějakého textu (řetězce) používáme nejčastěji příkaz echo a to třemi způsoby:
- řetězec uzavřený do jednoduchých uvozovek – apostrofů
- řetězec uzavřený do dvojitých uvozovek
- použít tzv. syntaxi heredoc v případě dlouhých textů
První způsob (apostrofy):
<?php
echo 'Toto je příklad řetězce.';
?>
Druhý způsob (uvozovky):
<?php
echo "Toto je příklad řetězce.";
?>
Důležité rozdíly mezi těmito dvěma způsoby zápisu jsou:
- do uvozovek můžeme psát jméno proměnné (viz dále) přímo.
- do apostrofů musíme proměnnou zapsat tak, že ji "obalíme" tečkami (tzn. konkadence):
<?php $body = 15; echo 'Pro získání oprávnění musíte mít ' .$body. ' bodů.'; ?>
- do uvozovek se dají psát speciální znaky jako je např. \n - odřádkování nebo \t - tabulátor a další (POZOR, prohlížeče neznají konstrukci \n, a tak nový řádek vidíme pouze ve zdrojovém kódu).
- do uvozovek můžeme psát i další uvozovky, ale musí použít tzv. escape sekvenci (viz níže). Použití uvozovek se tím pádem méně hodí na výpis HTML kódu, protože je složitější.
Třetí způsob: V případě, že potřebujete vypsat delší text, můžete použít tzv. syntaxi heredoc. Syntaxe heredoc začíná trojicí znaků <<<, za kterou následuje nějaký text nazývaný identifikátor (v našem případě MMM). Stejný identifikátor musíme použít na ukončení takovéhoto řetězce. Za úvodním identifikátorem nesmí začínat text. Ten musí být umístěn na novém řádku. Ukončovací identifikátor musí být na samostatném řádku, před ním nesmí být ani mezera, za ním musí být středník a nesmí se objevit v daném „dlouhém“ textu.
<?php
$text = <<<MMM
Toto je příklad dlouhého řetězce na
více řádků v heredoc syntaxi. Mohou to být
dlouhé věty..... Lorem ipsum dolor sit amet
Consectetuer lobortis lorem amet rutrum
Non Aenean Ut pellentesque condimentum
Accumsan laoreet ut turpis elit
Augue vitae Duis nec Nunc
Eget elit feugiat quis Ut
Vitae lobortis faucibus Aliquam wisi
Nam Donec sociis dictum commodo
Pede feugiat amet convallis metus
Tincidunt parturient quam pretium sapien
Nullam lorem libero vestibulum risus
Et metus sed purus nec
dipiscing est laoreet consectetuer enim
Id sed diam tellus ipsum
MMM;
echo $text;
?>
Escape sekvence
Pokud do textu potřebujete zapsat uvozovky či apostrof, musíte před takovýto znak vložit tzv. escape sekvenci:
<?php
echo "Tady bude uvozovka \" a text dále pokračuje.";
// Vypíše: Tady bude uvozovka " a text dále pokračuje
?>
PHP v tomto případě ví, že pokud se před uvozovkami či před apostrofem nachází zpětné lomítko, nekončí řetězec, ale je třeba následný znak vypsat. Pozn.: o escape sekvencích bude dále ještě zmíňka
Psaní HTML tagů do řetězců
V rámci psaní textových řetězců je možné také přímo do tohoto textu začlenit i jakékoliv HTML a CSS tagy. Příklad:
<?php
echo 'Tady bude <span style="color: red;">červený text</span>.
<br>
Další text na novém řádku.';
?>
Zjištění délky řetězce - strlen
V případě, že potřebujeme zjistit délku řetězce (počet znaků) využívá PHP k této operaci funkci strlen, v případě kódování UTF-8 v kombinaci s diakritikou se používá mb_strlen:
<?php
echo mb_strlen('Řidič');
// Vypíše se číslo 5, protože slovo Řidič má 5 znaků
?>
Za funkcí strlen jsou v závorkách předány tzv. parametry funkce. V tomto případě je to pouze řetězec 'ahoj'. Zápis funkce se odborně nazývá volání funkce. Výsledkem je vypsání čísla 4, jinak řečeno funkce vrací hodnotu. Funkci strlen můžeme využít i pro vypsání délky řetězce, pocházejícího z proměnné:
<?php
$a = 'Miloslav Boudný';
// Přiřazení řetězce do proměnné a.
echo mb_strlen($a);
// Vypíše délku řetězce v proměnné $a, tedy číslo 15.
?>
Odstranění bílých mezer - trim
Další praktickou vestavěnou funkcí je trim. Funkce trim odstraní tzv. bílé znaky ze začátku a z konce řetězce. Za bílé znaky jsou považovány mezery, tabulátory, konce řádků a další znaky. Lze využít např. u zadávání textových polí do formuláře a jejich kontrolu. Defaultně funkce trim odstraní tyto znaky:
- (ASCII 32 (0x20)), obyčejná mezera.
- (ASCII 9 (0x09)), tabulátor.
- (ASCII 10 (0x0A)), nová řádka (line feed).
- (ASCII 13 (0x0D)), návrat vozíku (carriage return).
- (ASCII 0 (0x00)), znak NUL.
- "x0B" (ASCII 11 (0x0B)), vertikální tabulátor.
Malá ukázka:
<?php
$text1 = " Karel ";
$text2 = " Svoboda ";
echo "Vaše jméno a příjmení je ".$text1." ".$text2;
echo "<br>";
echo "Vaše jméno a příjmení je ".trim($text1)." ".trim($text2);
// Je třeba si zobrazit zdrojový kód, jinak neuvidíte rozdíl.
?>
Funkce trim má také možnost zadání parametru V následujícím příkladu je např. odstraněno písmeno K a S. Jedná se o znaky, které musí být na začátku.
<?php
$text1 = "Karel";
$text2 = "Svoboda";
echo "Vaše jméno a příjmení je ".trim($text1,"K")." ".trim($text2,"S");
?>
Více informací k funkci trim Příbuzné funkce:
- ltrim() - odstraní bílé mezery zleva
- rtrim() - odstraní bílé mezery zprava
Získání části řetězce - substr
Další často používanou funkcí je funkce SubStr. Ta slouží k získání části řetězce. Má 3 parametry – řetězec, pozici 1. znaku a délku (oddělené čárkou): substr($řetězec, pozice 1. znaku, délka) Vrací část řetězce určené délky od daného znaku. Pokud je pozice 1. znaku záporné číslo, bude se pozice počítat od konce. Pokud je záporná délka, bude řetězec tolik znaků od konce končit. Není-li délka vůbec zadána, funkce vrátí vše od prvního znaku do konce řetězce. Tady je několik příkladů:
<?php
$text = "Caste hrani pocitacovach her nici krcni pater.";
echo substr($text, 6)."<br>"; // vrací znaky od 6 pozice - hrani pocitacovach her nici krcni pater.
echo substr($text, -6)."<br>"; // vrací znaky od 6 pozice zleva (od konce)- pater.
echo substr($text, 6, 5)."<br>"; // vrací znaky od 6. pozice v počtu 5 dalších znaků - hrani
echo substr($text, 6, -12)."<br>"; // vrací znaky od 6. pozice a z tohoto ještě odstaní 12 znaků od konce - hrani pocitacovach her nici
echo substr($text, -6, 5)."<br>"; // vrací znaky od 6 pozice od konce v počtu 5 znaků - pater
echo substr($text, -6, -3)."<br>"; // vrací znaky od 6 pozice od konce a poslední 3 znaky ještě taky odstraní - pat
?>
Nahrazení textového řetězce - str_replace
Asi nejpoužívanější funkcí je pak funkce str_replace. Obsahuje tři parametry – CO nahradit, ČÍM nahradit, KDE nahradit (oddělené čárkou): str_replace('CO','ČÍM','KDE'); Příklad:
<?php
$text = str_replace('ing.','Ing.', 'Tituly magistr - Mgr. a inženýr - ing. jsou na stejné úrovni. Píšou se vždy s velkým písmenem. Dříve se titul inženýr psal malými písmeny.');
echo $text;
// pokud se v textu objeví "ing.", nahradí se textem "Ing.".
?>
Zjištění pozice textu - strpos
Další podobnou funkcí je pak funkce strpos (pro UTF-8 opět s prefixem mb_). Jedná se o zjištění pozice, na které se nachází hledaný text, přesněji řečeno za kterou začíná hledaný text: strpos($text, "Hledaný text");
<?php
$text = "Není to PHP výborný jazyk?";
echo (mb_strpos($text, "PHP"));
// vrací hodnotu 8 - pozice, za kterou začíná text "PHP"
?>
Počítají se samozřejmě i mezery.
Pozor na diakritiku!
Pozor na diakritické znaky. Minimálně u funkcí strlen a strpos není tzv. "multibyte safe", což znamená, že "neumí" počítat diakritické znaky správně. Proto se používá jejich novější podoba - mb_strlen, mb_strpos, která již tuto diakritiku počítá správně. Více o Multibyte Safe.
Pro výpisy a nejen ty podrobné využíváme především tyto tři způsoby:
- příkaz echo
- funkce print_r
- funkce var_dump
Příkaz echo Nejčastější metoda pro výpis dat. Dobře postačí na jednoduché datové typy a to čísla a řetězce. Funkce print_r Je to daleko univerzálnější řešení, dokáže vypsat jakoukoliv hodnotu a to i tam, kde příkaz echo nestačí. Rozdíly mezi echo a print_r:
- zápis – print_r je funkce a proto se musí hodnota vypisovat do závorek (tak jako u každé jiné funkce), zatímco u příkazu echo se závorky používat nemusejí, ale mohou.
- počet vypsaných hodnot – echo umí vypsat více hodnot najednou, kdežto funkce print_r umí vypsat pouze jednu
- výpis složitějších dat – echo umí pouze řetězec a číslo. Print_r umí cokoliv
Funkce var_dump Další možností pro výpis dat je funkce var_dump. Tato funkce se liší tím, že kromě samotných dat vypíše i typ, o který se jedná:
<?php
var_dump("Adam");
//vypíše: string(4) "Adam"
?>
Slovo string je anglický název pro řetězec a PHP jej používá kdykoliv chce říci, že pracuje s řetězcem. Za slovem string je v závorce uvedena číslice 4, čímž je řečeno, že obsahuje 4 znaky. Pak následuje v uvozovkách již vlastní řetězec, tedy Adam. Proto této funkci říkáme diagnostická, jejímž účelem je především podat maximální informace o nějakých datech v PHP. Pro běžné výpisy se využívají první dva předchozí způsoby. Vyzkoušejte např. tyto další příklady. Vložte za slovo Adam jednu či více mezer a sledujte, jaký je mezi nimi rozdíl a to včetně zobrazení zdrojového kódu:
<?php
var_dump("Adam ");
// ale vypíše:
string(9) "Adam "
?>
Co je to datový typ – je to typ dat, které bude daná funkce, příkaz, skript apod. zpracovávat. V první řadě je třeba umět data vypisovat. V PHP existuje 8 základních datových typů, které dělíme na: Skalární datové typy Obsahují pouze jeden prvek informace (např. jedno číslo, jeden text).
- Boolean - logický datový typ. Jedná se o hodnotu pravda/nepravda, v zápisu PHP se zadává TRUE nebo FALSE (na velikosti písmen nezáleží).
- Integer - celočíselný typ. Jsou to celá kladná i záporná čísla. Rozsah hodnot závisí na platformě, kde PHP běží; obvykle se hodnota pohybuje někde okolo dvou miliard (32-bit signed).
- Float - desetinné číslo. Rozsah tohoto typu proměnné také závisí na platformě, kde PHP běží obvykle je k dispozici 1,8e308 hodnot (64-bit signed).
- String - řetězec (text). Řetězce jsou v PHP kódovány 1 bajtem, takže mohou obsahovat 256 znaků.
Složené datové typy Na rozdíl od předchozích typů mohou obsahovat složená data více prvků téhož typu (např. 5 jmen jakožto 5 textových řetězců).
- Array - pole. Jedná se o složený typ, který může obsahovat i ostatní datové typy.
- Object - objekt. Objektová proměnná může obsahovat různé prvky PHP, např. proměnné, funkce a konstanty.
Speciální datové typy
- Resource (v PHP 8 již není podporován) - obvykle se používá k interakci s externím zdrojem dat (např. databází). Pokud např. potřebujeme otevřít soubor(fopen), pak funkce vrací prostředek, který slouží k výběru zadaného souboru.
- Null - „nic“ (prázdná hodnota). Jedná se o zvláštní datový typ, který nemá žádnou hodnotu. Hodí se třeba tehdy, pokud není nějaká proměnná inicializována nebo pokud byla smazána funkcí unset(). Je také možné libovolné proměnné přiřadit hodnotu null dodatečně.
Zatímco string, integer a float můžete jednoduše vypsat příkazem print, u ostatních typů to není možné. Tam je to možné vypisovat mnoha jinými způsoby, k nejuniverzálnějším patří funkce var_dump() a var_export(). V PHP verzi 8 jsou další, nové datové typy nebo naopak některé jsou potlačeny.