HTML, HTTP hlavičky, obrázky, PDF generování propojení databází (DBF, MySQL, Oracle) operace nad protokoly (IMAP, SNMP, FTP, …) kódování, komprese, regexp podpora XML a XLS
3
Historie • PHP1, PHP/FI - 1994, 1995 – Rasmus Lerdorf pro své domácí stránky – skriptování + formální překladač + podpora mSQL
• PHP3 - 1997 – tým (Zeef Suraski, Andy Gutmans, a další) – přepsaný engine, mnoho pomocných funkcí
• PHP4 - 2000 – skriptovací engine od Zenda -> vyšší výkon – přidané funkce, podpora objektů, související objekty
• PHP5 – 2004 – Zend engine 2, lepší modely objektů – zabudovaný SQLite engine, MySQL není součástí
4
Související projekty • PEAR (PHP Extensions and Application Repository) – PHP verze základových tříd, rozšíření, navíc kódovací styl – balíčky: autentikace, date&time, … – rozšíření: debugging, SOAP, …
• Smarty – šablonový systém (viz níže) • PHP-GTK – psaní GUI aplikací na straně klienta
• PHP Documentor – Javadoc-like nástroj pro zdrojový kód PHP
5
Odkazy a literatura • On-line dokumentace – www.php.net/docs.php • Významný poznámkový manuál – www.php.net/manual/en
– český překlad (cz.php.net) – PHP builder (www.phpbuilder.com) – stránky J.Koska (www.kosek.cz/php)
• Literatura – J.Kosek – PHP tvorba interaktivních aplikací Grada Publishing 1999, ISBN 80-7169-373-1 – J. Castagnetto et al: Professional PHP Programming Wrox Press Inc, ISBN 1-86100-296-3 (also in Czech translation) – V. Smidek a kol.: PHP v příkladech, Kopp 2001, ISBN 80-7232-162-5
6
Základy jazyka
HTML embeeding PHP Hello World
• používá oddělovače stejné jako SGML – upřednostněné před
• také používá <script> element <script language="php"> echo ("some editors (like FrontPage) don't like processing instructions");
8
Syntax • Jako C/Java – Bloky, if-else, switch, while, for, return
• Některé elementy z perl, Unix shell, Java /* long comment */ if ($var == true) { command; } // end if
9
Typový systém • slabá typová kontrola, jednoduchá tvorba typů • vestavěné skalární typy: – boolean (true, false), int, float, string
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)
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)
PHP Form Example
"; } … pokračuje 36
Práce s formuláři (4) else { /* Form submitted, process */ echo "-- Your results
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 "
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)
Abstrakce databáze „Funkce přístupu do PHP databáze nejsou standardní. To vytváří potřebu pro (…) knihovny, aby se ukryly rozdílnosti databázových API“
• Účel
– abstrakce databáze => přepínání db serverů – křivka učení během standardizace
• Přístup
– ovladače + konfigurování (vybraného) serveru »
obsluha stringů a uvozovek, parametry připojení, překládací/mapovací sloupcový typ
• Knihovny
– PEAR DB, MDB
• aktualizace přes fáze prepare/execute
– ADOdb
• dotazy a aktualizace přes generované SQL • 30 serverů/variant podporovaných včetně ODBC
46
HTTP autentikace Předpoklady – PHP běží jako modul Apache
Funkce – int header(string header) • posílá řádek neupravené HTTTP hlavičky • tomu nesmí předcházet žádný výstup
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}
const.* pro hodnoty konstant PHP get.* , post.* , cookie.* , session.* pro požadovaná data {$smarty.now|date_format:"%H:%M:%S"} config.* pro proměnné config-defined
– konfigurační proměnné • config file in .ini-style
fg = “black” bg = “white” • Zavést přes {config_load file=”...” [section=”...”] } • Zobrazit také přes {#name#}
64
Smarty: proměnné (2) Modifikátory – starší hodnota proměnné – syntaxe je {$var|modif:param...|modif|...} • count_words • date_format – použití modifikátorů strftime() • • • • • •
{$datum|date_format:”%H:%M”} default – implicitní hodnota pokud není proměnná nastavena escape – parametr je “html|url|quote|...” lower|upper regexp_replace – parametry jsou regulární výrazy, nahrazení {$var|regexp_replace:”/[\n\r]/”:” ”} strip_tags – oddělí vše mezi “<” and “>”
65
Návrh PHP kódu getData($_param['id']); $template->assign('publication',$pubData); $template->setMode(DETAIL); } else {// view is „list" $pubList = $pub->getList(); $template->assign('list',$pubList); $template->setMode(LIST); } // show resulting page $template->display(); ?> 66
Dokumentování PHP kódu • pro aplikace je dokumentování nezbytné – standardní praktiky softwarového inženýrství – užitečný přístup: generování ze zdrojových komentářů
phpDocumentor • http://phpdocu.sourceforge.net/ • používání komentářů a tagů jako javadoc – generování HTML, RTF, PDF, DocBook – příkazová řádka nebo webové rozhraní
• struktura a umístění komentářů – /** .. */ s volitelným HTML kódem – hlavička souboru, před deklarací třídy/proměnné/funkce
@package name – balík v PHP projektu @param type $name desc – parametr funkce @return type desc – návratová hodnota funkce @access public|private – pro metody třídy @global type $varname – globální proměnné @see elname – reference na dokumentovaný prvek
/** * Nastavuje zakladni udaje o strance. * @param string $title text nadpisu stranky * @param string $area oblast v mape webu * @access public * @see $SITE_AREAS */ function setTitle($title="bez nazvu", $area=””) 68
PHP4 vs PHP3 • Zend skriptovací engine – předkompilování do bytekódu, rychlost, přizpůsobivost
• malé změny v jazykové syntaxi – reference ($p_a = &$a;) – here-doc: echo <<<EOT Some very long text … EOT; – datový typ boolean (caveat: 10 != true) – pole smí obsahovat objekty