\n"; echo "This is a ${type} text."; ?> 11
Pole • Obecný strukturovaný typ – array, map, hash – mapování: klíč => hodnota – implicitní index: 0-based integer – vícerozměrné pole, smíšené pole
• Vytvořeno pomocí array() $colors = array( 'black','red','gray' ); $pers_data = array( // associative 'name' => 'Brada', 'room' => 409 ); if ($colors[$i] == 'gray') { ... } $person = $pers_data['name']; foreach ($colors as $c) { echo “barva: $c
”; } 12
Práce s poli • iterace: foreach, each(), array_walk() • vytváření: explode(), array_slice(), sort()/asort() • klíče/hodnoty: array_keys(), in_array()
13
Reference • od PHP4 • odkazuje vícekrát na stejnou proměnnou – použití & operátorem – hlavní použití v parametrech pass-by-ref funkcích $a = 30; $b =& $a; echo "b: ". ++$b ." and a: ". $a; // returns "b: 31 and a: 31" – srovnání: rovnost vs. Totožnost • $a == $b ... stejná hodnota • $a === $b ... stejná hodnota a typ
14
Konstanty – neměnné proměnné se stringovými jmény • používá konstrukci define() • žádný $ příznak
define("COUNT", 80); ... if (!defined("COUNT") die("No count."); for ($i=0; $i
15
Rozsah proměnných • globální proměnné: deklarovány na nejvyšší úrovni • lokální proměnné: deklarovány uvnitř funkcí – statické proměnné – jako v C
• konflikty jmen řešeny pomocí global • superglobals – speciální globální pole – nepotřebují deklarovat jako globální uvnitř funkcí – asociativní pole s proměnnými HTTP atd. $_GET[], $_POST, $_COOKIE, $_SERVER $_FILES, $_SESSION, $_ENV, $GLOBALS
16
Vkládání souborů • require() require("/inc/main.php"); – vloží obsah souboru/URL nebo error
• include()
include("_head.php");
– vloží obsah souboru/URL nebo varování
• pozor – soubory musí být samostatné PHP – žádné funkce => if () { include($file) } – do verze 4.0.2, require() čte i v případech jako if(false) require(„file.inc“)
• neopakovaná inkluze: konstruktor *_once() 17
Imperativní styl Funkce – jako C • názvy bez $ • může být definována implicitní hodnota proměnné (na konci) • volitelná návratová hodnota
function foo($par1, $par2 = 255) // ($par2=255, $par1) would be incorrect { $res =$par1 + rand(0,$par2); return $res; } // standard function invocation $bar = foo(10); 18
Imperativní styl (2) Parametry – implicitně předávané hodnotou function add($a,$b) { return $a+$b; } • pozor s objekty
function foo($par1, $par2 = 255) // ($par2=255, $par1) would be incorrect { $res =$par1 + rand(0,$par2); return $res; } // standard function invocation $bar = foo(10); – může být předávána odkazem function add(&$a,$b) {return $a=$a+$b;} 19
Třídy a objekty • PHP podporuje objektově orientované programování – rozdíl mezi PHP3, PHP4 a PHP5 – PHP5: robustní objektový model (destruktory, …)
20
Třídy a objekty (2) • deklarovány stejně jako v Javě – jednoduchá dědičnost, žádné rozhraní – (PHP5) viditelnost modifikátorů public, protection, private class Person { var $name; // deprecated in PHP5 protected $age; public function isChild() { return $this->age < 12; } } class Child extends Person { private $toy; function Child($aToy) // constructor { $this->toy = $aToy; } }
21
Třídy a objekty (3) • konstruktor – (PHP4) ClassName(), (PHP5) __construct() a __destruct() (explicitní volání rodiče) – (PHP5) má klíčové slovo final
• rodič a self odkazy – použití rodiče:: klíčové slovo – použití self:: klíčové slovo, atribut &this
Instance – vytvořena použitím operátoru new $aPerson = new Child("Teddy Bear"); if ($aPerson->isChild()) echo "The toy is " . $aPerson->toy; 22
Třídy a objekty (4) – Class scope vlastnosti: použitím operátoru „::“ • (PHP4) bohužel žádné class-scope atributy • (PHP5) lze vytvořit konstanty define()d class Person { function id() { return "Person"; } const species = "Homo Sapiens"; } echo Person::id()."is".Person::species;
23
Třídy a objekty (5) Porovnání objektů – rovnost kontroluje strukturu objektu a třídy – shodnost kontroluje samotný objekt $a = new Person(); $b = new Child("whale"); $c =& $a; ($a == $b) ? "equal" : "neq"; ($a === $c) ? "identical" : "non-id";
24
PHP5: přidané vlastnosti Abstraktní třídy, rozhraní – stejné jako v Javě • abstraktní třída má nejméně jednu abstraktní metodu • rozhraní definuje pouze hlavičky metod
Vzorové nápovědy v funkcích – urychluje psaní formálních parametrů • public function test(OtherClass $othercalss) … • fatal error on type mismatch
Objektové iterace – foreach iteruje přes všechny viditelné atributy – můžene redefinovat přes rozhraní Iterator • rewind(), current(), next(), key(), valid() metody
25
PHP5: přidané vlastnosti (2) Magické metody – začínající __ prefixem (vyhrazeno) • __sleep(), __wakeup() pro serializaci • __toString() pro přímé použití echo $object • __clone() pro hluboké kopie bez kopírování referencí
Výjimky – try-catch bloky (ne finally) – throw objekt Exception nebo potomka • neobsloužená výjimka => fatal error • globálně lze set_exception_handler($function)
26
Použití PHP PIA 2005/2006 Téma 6
Copyright © 2003 Přemysl Brada, Západočeská univerzita
Vzhled stránky Zdrojový kód
Quick brown fox jumped over a lazy dog. This text is repeated 4 times. ... 28
Vzhled stránky (2) Úryvky zdrojového kódu pro vzhled stránky \n
\n"; echo "Home | \n"; echo "Email\n"; echo "
<small>Back to\n"; echo "$link\n"; }
30
Vzhled stránky (4) Výsledek (renderování)
31
Vzhled stránky (5) Výsledek (zdrojový kód)
32
Vzhled stránky: alternativa • zahrnutí HTML textu do PHP skeletonu – namísto zahrnutí PHP kódu v textu
• výhody – šablona definována pouze jednou => jenoduché změny
• nevýhody – potřeba přepisování „špinavého“ query-based URI nebo URL »
/show.php?dir=section&page=index
– vložené HTML může být jedině v části BODY => obtížné s WYSIWYG editory 33
Zpracování formulářů • historicky první a klíčová funkce PHP – získává jednoduše hodnoty pole formuláře – jednoduše je zpracuje
• logicky oddělené vrstvy – stránka formuláře (form.html) – výpočetní logika (process.php) používá $_GET[] a $_POST[] pole – výsledná stránka (může být proces.php nebo šablona)
• implementace může spojit vše do jednoho – potřeba testování existence pole formuláře – pozor na těžkopádnost kódu
34
Práce s formuláři – poznámky • bezpečnost kódu – předpokládáme register_globals off – použit superglobální $_GET[] and $_POST[]
• bezpečnost dat – preferovat POST to GET
35
Práce s formuláři (3) form.php (kombinovaná verze)
Hello, "; if ($_POST['name'] != "") echo $name; else echo "anonymous"; switch ($_POST['age']) { ... case "32": echo "Too old to rock'n'roll..."; break; default: echo "(Don't know your age? Poor you!)\n"; } /* Show for another attempt */ unset($_POST['submit']); echo "
Try again?\n"; }?> 37
Práce s formuláři (5) Renderování stránky -- formulář
38
Práce s formuláři (6) Renderování stránky – výsledek (POST, GET)
39
Přístup do databáze • Datové formáty podporované PHP – textové formáty • čistý text • CSV
– databázové formáty • dBase, dbm-style (Berkeley dbm, Sleepycat DB2) • LDAP • SQL servery (MySQL, Postgres, Oracle, Microsoft SQL Server, Sybase, SQLite)
• Typická volba pro PHP: MySQL, PostgreSQL
40
Přístup do databáze (2) • Funkce pro práci s SQL – liší se v závislosti na serveru (servername_ prefix) • připojení databáze • DDL + DML funkce (dotazy) • správa transakcí, atd. (server-dependent)
• Související projekty – abstraktní vrstvy db • PEAR DB, MDB • ADOdb
– databázoví správci • phpMyAdmin
41
Přístup do databáze: MySQL • Správa připojení – připojení k databázi: vrací handler připojení • mysql_connect($server, $user, $pass, ... ) • mysql_pconnect( ditto ) • mysql_close() » automaticky na konci skriptu
• mysql_select_db($dbname, $link)
– persistentní připojení • používá se, pokud jsou režijní náklady připojení vyskoé • nepoužívá se, pokud jsou požadovány transakce nebo zámky
42
Přístup do databáze: MySQL (2) • Dotazy – tvorba dat • mysql_create_db() | mysql_drop_db()
– dotazy • $resultset mysql_query($query, [$link]) » $query je string, žádný “;” na konci
» crací result set » používáno pro všechny DML (insert, select, delete)
• int mysql_num_rows($resultset) » array mysql_fetch_array($resultset [, $type]) » pole odkazů číselné (MYSQL_NUM) nebo asociativní (MYSQL_ASSOC), nebo oboje (default)
• object mysql_fetch_object( ditto ) • object mysql_fetch_field($resultset, $fieldoffset) » name, not_null, primary_key, type, ... atributy
43
Přístup do databáze: MySQL (3) \n"; while ($row = mysql_fetch_array($result)) { print "\t
[ ">Nastav skin ]
Session trva vterin. 56
Vzory struktury PHP aplikací
Skriptované aplikace • Cíl: snadný vývoj, minimální run-time overhead • Struktura – hlavní script – knihovny pro základní funkce – vkládání výkonného kódu přes include()
58
Skriptovaná aplikace: příklad
59
Vícevrstvé aplikace • Cíl = separace obsahu a prezentace (už zase) – databáze (model): knihovny abstrahované databáze + možná reprezentace dat (classes/assoc) – bussines logika (controller): knihovny + množina vysoce soudržných skriptů jádra – prezentace (vzhled): šablonový engine
• Základní přístup = použít PHP jako kdyby to bylo C/C++ – oddělená konfigurace, knihovny, řídící logika – abstrakce v knihovnách – prezentaci přes zobrazovací funkce nebo šablonový engine http://www.tonymarston.net/php-mysql/sample-application.html
60
Vícevrstvá aplikace: příklad aplikační logika
zobrazení
61
Tvorba stránek pomocí šablon • šablony: oddělení prezentace od logiky – v PHP starý dobrý Model-View-Controler – data v databázi/souborech, aplikační logika v PHP, zobrazování přes prezentační šablony – šablony obsahují HTML + placeholders pro hodnoty
Smarty engine – smarty.php.net -> PHP knihovna – třída Smarty, klíčové metody • assign(fieldname,value); • display(templatename);
include('Smarty.class.php'); $smarty = new Smarty; // assign some content $smarty->assign('name', 'george smith'); // display it $smarty->display('index.tpl');
62
Smarty: příkazy • placeholders – {$varname} zobrazuje přiřazenou hodnotu; může přidávat modifikátory a default
• příkazy – – – –
{include file=”filename”} – zahrnutí šablon {if $varname == value} ... {/if} – základní řízení {section name=index loop=$arrayname} ... {/section} – generování iterativního obsahu (polí)
{include file="header.tpl" title="User Info"} User name: {$name|capitalize}
{$users[mysec].name|default:”(anon)”} |