PHP_01 - Základy jazyka
1. Obsah
- Obsah
- Úvod
- Začlenění PHP do stránek
- Typy proměnných
- INTEGER
- DOUBLE
- STRING
- ARRAY
- Přetypování a konverze
- Operace s proměnnými
- Komentáře
- Předávání obsahu prvků formuláře do proměnné
- Úkol
- Zdroje a citace
2. Úvod
- PHP je skriptovací jazyk běžící na straně serveru (server-side) speciálně navržený pro potřeby webové stránky,
- skripty se zpracují na serveru a data jsou odeslána klientovi,
- jedná se o Open Source projekt,
- autorem první verze PHP je Rasmus Lerdorf (1994) a později další spoluautoři (Andi Gutmans, Zeev Suraski, ...),
- první verze PHP se objevila v roce 1995 jako Personal Home Page Tools,
- akronym PHP je rekurzivní zkratka PHP: Hypertext Preprocessor, česky "PHP: Hypertextový preprocesor", původně Personal Home Page,
- nyní (v roce 2012) existuje verze PHP 5.4, a verze 6.0 je ve vývoji,
- PHP se nachází na mnoha platformách (Linux, UNIX, Solaris a OpenBSD, Microsoft Windows, Mac OS X, RISC OS a jiné),
- adresa na stránky PHP je http://www.php.net/ nebo http://cz.php.net/
- manuál najdete na http://www.php.net/manual/ či ke stažení v offline podobě zde [30Mb],
- a z časti přeložený manuál do češtiny (ale pro starší verze PHP) najdete zde [2,7Mb].
3. Začlenění PHP do stránek
Nejjednodušší způsob:
<? echo "1.způsob"; ?>
U tohoto způsobu ale pozor na nastavení některých webových hostingů, které z důvodu podpory více interpetovoaných jazyků,
tuto zjednodušenou direktivu <?
nepodporují, proto se obecně doporučuje používat následující 2. způsob, který funguje vždy a všude!
Vhodné pro generování XML dokumentů:
<?php print "2. způsob"; ?>
<script language="php">
echo "3. způsob";
</script>
Příkaz echo
versus print
:
Podle této studie je příkaz echo o něco rychlejší než příkaz print
- při zpracovaní velkého objemu
výstupních dat. Osobně mám z praxe vyzkoušeno, že je vhodné všude na výstup dat používat příkaz echo
a print
používat jen při debuggingu
(lazení) aplikace pro výstup kontrolních dat či chybových hlášek. Poté stačí, před nasazením aplikace do ostrého provozu, skripty aplikace projít hromadným vyhledávaáním
a odstranit všechny print
y, aby někde nedocházelo ke zobrazování dat uživatelům, které jim nejsou určena.
Úkol:
Vytvořte na vašem serveru, který podporuje PHP (Apeche, WAMP, ...) skript bez diakritiky "vase_prijmeni.php"
a vložte do něj následující kód:
<?php
phpinfo();
?>
Skript zavolejte v prohlížeči na adrese http://localhost/vase_prijmeni.php
a prohlédněte si výsledek.
4. Typy proměnných
string
- textový řetězecinteger
- celé číslodouble
- číslo s desetinnou čárkouboolean
- hodnota true nebo falsearray
- poleobject
- objekt
Pravidla pro použití a tvorbu názvu proměnné:
- Před názvem proměnné musí být znak $ (amerického dolaru),
- název proměnné musí začínat písmenem nebo podtržítkem,
- proměnná je automaticky deklarována při prvním použití,
- doporučují se názvy bez háčků a čárek,
- názvy jsou "citlivé" na velikosti písmen.
Doporučená pravidla pro použití a tvorbu názvu proměnných:
- Proměnné začínat malými pismeny,
- psát je bez mezer a prvni písmeno nového slova velkým znakem:
$mojeNovaPromena = 'Nazdar světe';
, - názvy psát vždy česky (bez diakritiky) nebo vždy anglicky a to v celém projektu,
- volit jasné, stručné a výstižné názvy.
5. INTEGER
Rozsah je <-2 147 483 648; + 2 147 483 648>V šestnáckové soustavě zapisujeme ve tvaru 0xčíslo nebo 0Xčíslo, používáme malá nebo velká písmena ABCDEF.
Pozor! Pokud číslo začíná nulou pak je považováno za číslo v osmičkové soustavě.
$cislo = 10; // 10
$cislo = 0x0A; // 10 šestnáctkově
$cislo = 012; // 10 osmičkově
6. DOUBLE
Rozsah je přibližně <-1.7 10308; +1.7 10308>.Nejmenší kladné číslo je 3.4 10-324. Větší přesnost dosáhnete s použitím knihovny BC.
Čísla v exponenciálním tvaru zapisujem pomocí e nebo E.
$deset = 3.14;
$deset = 5.1e3; //hodnota je 5 100
7. STRING
Řetězce zapisujeme do uvozovek ("text") nebo apostrofů ('text'). Pokud potřebujeme speciální znaky použijeme "escape sekvence" začínající zpětným lomítkem (\).Sekvence | Význam |
---|---|
\t | tabulátor |
\\ | zpětné lomítko |
\$ | dolar |
\" | uvozovky |
\' | apostrof (jen u řetezce, který začíná apostrofem!) |
\r | "návrat vozíku" |
\n | nový řádek |
\r\n | ukončení řádku ve windows |
ASCII | Znak |
---|---|
\41 osmičková soustava | A |
\x42 šestnáctková soustava | B |
V PHP je velký rozdíl v použití uvozovek nebo apostrofu pro definování hodnoty retezce. Rozdíl mezi uvozovkami a apostrofy uvidíte na následujících příkladech.
Příklad 6.1Vytvořte si na vašem webovém serveru skript
retezec.php
a do něj vepište tento kód:
<?php
$skola = "EDUCAnet Brno";
echo "Moje škole se jmenuje $skola.<br />\r\n";
echo 'Moje škole se jmenuje $skola.';
?>
Vyzkoušejte výstup v prohlížeči zadáním adresy http://localhost/retezec.php
a provnejte výstup!
Řetězec je pole znaků, ukážeme na příkladu.
Příklad 6.2Vytvořte si na vašem webovém serveru skript
retezecjepole.php
a do něj vepište tento kód:
<?php
$skola = "EDUCAnet Brno";
echo $skola."<br />\r\n";
echo $skola[0];
echo $skola[1];
echo $skola[2];
?>
Vyzkoušejte výstup v prohlížeči zadáním adresy http://localhost/retezecjepole.php
a provnejte výstup!
8. ARRAY
Prvky pole mohou být libovolného typu.Příklad 7.1:
$pole[0] = "škola";
$pole[1] = 2006;
$pole[2] = 3.14;
Můžete použít i asociativní pole.
Příklad 7.2:
$pole["skola"] = "EDUCAnet Brno";
$pole["zeme"] = "MORAVA";
Pro použití asociativního pole uvnitř řetězce uvozeného uvozovkami ("), se používá speciální notace pomocí složených závorek { }.
Takže náš index zeme
bychom z $pole
v našem řetezci zavolali takto: echo "Země pro naší školu je {$pole['zeme']} dobré, že?";
Jiný způsob inicializace pole.
Příklad 7.3:
$pole = Array ("Petr", "Pavel", "Jiří",);
Za poslední položkou v poli může volitelně následovat čárka, ale nemusí, což se hodí napžíklad při generování pole pro PHP skript v jiném jazyce Java, Perl a podobně.
Pokud chceme aby indexace pole začínala od 2 nikoli od 0 zvolíme zápis jako v příkladu 7.4.
Příklad 7.4:
$pole = Array (2=>"leden", "únor", "březen");
Můžete definovat i vícerozměrná pole, jak je vidět v příkladě 7.5.
Příklad 7.5:
<?php
$pics_arr['245AH']['PIC_DIR'] = '2'; // adresar s obrazky
$pics_arr['245AH']['GEO'] = Array('GEO_49_996582_17_271894.PNG');
$pics_arr['245AH']['A'] = Array('A1_245AH.JPG'=>'A1_245AH_HOV.JPG');
$pics_arr['245AH']['B'] = Array('B1_245AH.JPG'=>'',
'B2_245AH.JPG'=>'',
'B3_245AH.JPG'=>'B3_245AH_HOV.JPG');
$pics_arr['245AH']['GPS'] = '49°59\'47.688"N 17°16\'18.805"E Přesnost GPS umístění: ±5 m';
$pics_arr['245AH']['EQI'] = Array(1,7); // vybaveni
$pics_arr['245AH']['ACC'] = Array(3,6); // dostupnost
?>
9. Přetypování a konverze
Většinu přetypování a konverze provádí PHP automaticky. Pokud chceme mít jistotu, používáme následující funkce.
GetType($promenna)
Is_Integer($promenna)
Is_Double($promenna)
Is_String($promenna)
Is_Array($promenna)
Is_Object($promenna)
Změnu typu proměnné provádíme funkcí
SetType($promena, typ)
.
Dočasnou změnu pro použití ve výrazu následovně $realnecislo = (double) $celecislo;
.
10. Operace s proměnnými
Operace | Normální způsob | Poznámka | |
---|---|---|---|
sčítání | $a = $a + $b; |
$a += $b; |
|
odčítání | $a = $a - $b; |
$a -= $b; |
|
násobení | $a = $a * $b; |
$a *= $b; |
|
dělení | $a = $a / $b; |
$a /= $b; |
|
modulo | $a = $a % $b; |
$a %= $b; |
|
preinkrementace | $a = $a + 1; |
++$a; |
zvětší o 1, pak vrátí hodnotu |
postinkrementace | $a++; |
nejprve vrátí hodnotu, pak zvětší o 1 | |
predekrementace | $a = $a - 1; |
--$a; |
zmenší o 1, pak vrátí hodnotu |
postdekrementace | $a--; |
nejprve vrátí hodnotu, pak zmenší o 1 |
Příklad 9.1:
<?php
echo "Postinkrementace";
$a = 5;
echo "Mělo by být 5: " . $a++ . "<br>\n";
echo "Mělo by být 6: " . $a . "<br>\n";
echo "Preinkrementace";
$a = 5;
echo "Mělo by být 6: " . ++$a . "<br>\n";
echo "Mělo by být 6: " . $a . "<br>\n";
echo "Postdekrementace";
$a = 5;
echo "Mělo by být 5: " . $a-- . "<br>\n";
echo "Mělo by být: " . $a . "<br>\n";
echo "Predekrementace";
$a = 5;
echo "Mělo by být 4: " . --$a . "<br>\n";
echo "Mělo by být 4: " . $a . "<br>\n";
?>
Příklad | Nebo | Název | Výsledek |
---|---|---|---|
$a and $b |
$a && $ b |
And | TRUE, když $a a $b současně mají hodnotu TRUE. |
$a or $b |
$a || $b |
Or | TRUE, když $a nebo $b má hodnotu TRUE. |
$a xor $b |
Xor | TRUE, když pouze $a má hodnotu TRUE nebo pouze $b má hodnotu TRUE. |
|
!$a |
Not | TRUE, když $a nemá hodnotu TRUE.
|
|
Znak ' | ' můžeme na české klávesnici napsat stisknutím pravého Altu a w (Alt + W). |
Spojování řetězců
Pro spojování (zřetězení) používáme operátor tečka, nikoli operátor plus (+). Pokud náhodou použijete plus místo tečky bude výsledný řetězec 0!
Příklad 9.2:
$celynazev = $nazev1.$nazev2;
$pozdrav = "Ahoj ".$jmeno;
$pozdrav .= "a na závěr";
Ternární (podmíněný) operátor
Velice užitečný zápis jednoduchých podmínek, který šetří čas a misto ve skriptech. Ternální operátory lze
samozřejmě i zanořovat, ale je potřeba vhodně uzávorkovat výrazy a přikazy. Ternální operátor ve stejném syntaktickém použití využijete ve všech post-cobolských jazycích jako je C, C#, Java, Javascript a pod.
Obecná syntaxe výrazu: podmínka?prikaz_pri_pravde:prikaz_pri_nepravde;
Pokud je podmínka pravdivá bude proveden příkaz 1 jinak bude proveden příkaz 2.
<?php
$cislo = 0;
echo ($cislo > 0)?"číslo je kladné":"číslo je záporné ";
?>
Příklad 9.4:
Ukázka zanořeného ternálního operátoru pří zjištění dělitelnosti čísla čísly 2 a 6.
Podle přiřazené hodnoty do proměnné $cislo
bude vypsána jedna z možností:
- Dělistelnost 6 i 2.
- Dělistelnost jen 6.
- Dělistelnost jen 2.
<?php
$cislo = 6;
echo 'Dělistelnost '.(($cislo % 6 == 0) && ($cislo % 2 == 0))?'6 i 2.':
('jen '.($cislo % 6 == 0)?'6.':($cislo % 2 == 0)?'2.': 'ani 6 ani 2.');
?>
Všimněte si optimalizace redundancí v kódu pomocí zřetězeni a podobně.
11. Komentáře
- Pro jeden řádek použijeme
// komentar jednoho radku
- nebo
# komentar jednoho radku
. - Pro více řádkový komentář použijeme
/* komentar na více radku */ echo 'A tohle uz zase funguje';
12. Předávání obsahu prvků formuláře do proměnné
Předávání probíhá metodou get nebo post. Za tímto účelem existují v php globální pole
$_POST[]
a $_GET[]
(Pozn.: způsobů předání je více např. pomoci pole $_REQUEST
, případně jde PHP kompiler nastavit, aby všechny prvky formulářů s uvedeným name převáděl na proměnné jako $hodnota_name_atributu
, což je ale velice nevhodný způsob ze strany výkonu...)
Příklad 11.1:
Ukázka formuláře v HTML.
<form method="post_nebo_get" target="cilova_adresa_formu">
Zadejte prosím vaše jméno:
<input type="text" name="uzivatel">
<input type="submit" value="Odeslat" name="odeslat">
</form>
V PHP se pak podle typu metody na formu zavolá hodnota inputu uzivatel takto:
<?php
// v pripade metody GET
$uzivatel=$_GET['uzivatel'];
// v pripade metody POST
$uzivatel=$_POST['uzivatel'];
?>
...samozřejmě se takto dá zavolat i input odeslat. Také nesmíme zapomenout ošetřit vstupy pro případ, že:
- input není vyplněn,
- není stisknuto tlačítko odeslat,
- vložená data proti útokům SQL injection, XSS a pod.
Ale ono ošetření je již na vás, na metodách jaké zvolíte a podobně, ale přidávám příklad jedné ze základních metod ošetření pro případ 1.
Příklad 11.2:<?php
// v pripade metody GET
// -> osetreno jen na exsitujici hodnoty pomoci ternalniho operatoru a metody isset
// (lze pouzit i metodu empty)
$uzivatel=isset($_GET['uzivatel'])?$_GET['uzivatel']:'';
// v pripade metody POST
// -> osetreno jen na exsitujici hodnoty pomoci ternalniho operatoru a metody isset
// (lze pouzit i metodu empty)
$uzivatel=isset($_POST['uzivatel'])?$_POST['uzivatel']:'';
?>
13. Úkol
Napište php skript ukol01.php
, který zpracuje data z tohoto formuláře (metoda je
post položky cislo1 a cislo2
):
S čísly provede 5 různých matematických operací a vypíšte je. (ve tvaru např. 1 + 2 = 3 atd.)
14. Zdroje a citace
- ACHOUR, Mehdi, Friedhelm BETZ, Antony DOVGAL, Nuno LOPES, Hannes MAGNUSSON, Georg RICHTER, Damien SEGUY a Jakub VRÁNA. PHP: PHP Manual. [online]. [cit. 2012-08-21]. Dostupné z: www.php.net/manual/
- W3SCHOOLS.COM. PHP Operators [online]. [cit. 2012-08-21]. Dostupné z: http://www.w3schools.com/php/php_operators.asp
- VRÁNA, Jakub. Kniha 1001 tipů a triků pro PHP [online]. 1. vyd. 2010 [cit. 2012-08-21]. Dostupné z: http://php.vrana.cz/kniha-1001-tipu-a-triku-pro-php.php
- How to differentiate between the popular Echo and Print commands in PHP. In: Learn PHP Online [online]. [cit. 2012-08-22]. Dostupné z: http://www.learnphponline.com/php-basics/php-echo-vs-print
- Poznámky neznámého učitele ze SPŠ Zlín :-)