PHP5 ide do finále
Seriál článkov pripravených pre časopis PC REVUE o piatej verzii
skriptovacieho jazyka PHP. V ňom je veľký dôraz položený na rozšírenie
možností objektovo orientovaného programovania. Články sú zostavené tak,
že nové črty PHP overujú na jednoduchých príkladoch. Je to dôležité preto,
lebo v čase vzniku článkov neboli k dispozícii literárne pramemene, ktoré
by podrobne rozoberali nové možnosti PHP. Je to dôležité aj preto, lebo
pokusmi s príkladmi je možné overiť pravdivosť tvrdení a záverov uvedených
v článkoch.
Poznámka
Po uvedení finálnej verzie PHP 13. 7. 2004 bol zmenený názov
seriálu na PHP 5 je vo finále a neskôr na
PHP 5 .
Obsah
- Úvod
- Ochrana premenných a funkcií triedy
- Statické premenné a funkcie triedy
- Statické členy a dedičnosť
- Abstraktné triedy a interfejsy
- Klonovanie, priestory mien a výnimky
- Práca s údajmi zapísanými v XML
- SQLite - odľahčená databáza
- Vylepšené rozhranie s MySQL
- Podpora pre webové služby
Poznámky
- Príklady budú fungovať iba v PHP5. Boli overevoné v PHP5.0.0RC2
z 31. marca. 2004. Finálna verzia PHP5.0.0 je použitá od štvrtej
časti.
- Príklady treba nainštalovať - pozri dokument:
Inštalácia príkladov.
- Prístup k príkladom získate klepnutím na ikonu knihy.
- Zdrojový text príkladov zobrazíte klepnutím na (kód).
- Pre návrat z príkladu na túto stránku použite ikonu "Dozadu"
v paneli nástrojov prehliadača.
-
Pri experimentoch s príkladmi môžete odkomentovať "problematické"
príkazy podľa textu článkov.
PC REVUE 5/2004: PHP5 ide do finále časť 1.
Úvod
Prvý zo série článkov ukazuje význam objektovo orientovaného programovania
a jeho možnosti v PHP5. Pojednáva o zmene spôsobu odovzdávania objektov
v argumentoch funkcií. Kým v PHP4 sú objekty odovzdávané hodnotou (vytvára
sa kópia objektu) v PHP5 sa v argumentoch funkcie odovzdávajú referencie.
V článku sa píše tiež o konštruktore a deštruktore objektov triedy.
Príklady
^^
PC REVUE 6/2004: PHP5 ide do finále časť 2.
Ochrana premenných a funkcií triedy
Jednou z hlavných výhrad voči objektovo orientovanému programovaniu v PHP4
je, že v ňom absentuje ochrana prístupu k členským premenným a funkciám
triedy. V PHP5 boli zavedené klasifikátory public, protected a private.
Predmetom článku je na jednoduchých príkladoch overiť, ako sa nimi dá
dosiahnuť ochrana prístupu k členským premenným a funkciám triedy. Príklady
preverujú účinnosť týchto klasifikátorov v kontexte objektu danej triedy,
ako aj v kontexte rozširujúcej triedy.
Príklady
-
02/01.php -
(kód)
Overenie ochrany prístupu k členským premenným triedy.
-
02/02.php -
(kód)
Funkcie pre prístup k chráneným premenným triedy.
-
02/03.php -
(kód)
Overenie ochrany prístupu k členským funkciám triedy.
-
02/04.php -
(kód)
Overenie ochrany prístupu k členským premenným rodičovskej triedy.
-
02/05.php -
(kód)
Overenie ochrany prístupu k privátnej premennej rodičovskej triedy.
-
02/06.php -
(kód)
Overenie ochrany prístupu k členským funkciám rodičovskej triedy.
^^
PC REVUE 7/2004: PHP5 ide do finále časť 3.
Statické premenné a funkcie triedy
Skúmanie nových čŕt PHP v oblasti objektovo orientovaného programovania je
v tomto článku zamerané na špeciálne funkcie __construct, __call, __get,
__set a __destruct. Overované je tiež použitie statických premenných a
funkcií triedy.
Príklady
-
03/01_spec.php -
(kód)
Overenie špeciálnych funkcií triedy. Pozri zdrojový kód stránky
vygenerovanej skriptom - výpis z deštruktora je až za koncovou značkou
html.
-
03/01_specA.php -
(kód)
Overenie špeciálnych funkcií triedy - to isté ako predošlý príklad.
V kóde skriptu sú doplnené zložené zátvorky, ale ani nimi sa nedá
dosiahnuť ukončenie platnosti vytvoreného objektu. Ten končí až na
konci skriptu.
-
03/01_specB.php -
(kód)
Overenie špeciálnych funkcií triedy - to isté ako prvý príklad, ale
kód skriptu je "zabalený" do funkcie. Tak sa dá dosiahnuť zrušenie
objektu pred koncom skriptu - končí sa po volaní funkcie.
-
03/02_pokusA.php -
(kód)
Použitie neexistujúcej členskej premennej. PHP umožnuje použiť
premennú, ktorá v triede nie je deklarovaná.
-
03/02_pokusB.php -
(kód)
Použitie neexistujúcej členskej premennej a funkcia __set. Nenastavenie
hodnoty vedie k oznamu "Undefined property".
-
03/02_pokusC.php -
(kód)
Použitie neexistujúcej členskej premennej, vo funkcii __set je nastavená
hodnota premennej.
-
03/03_staticp.php -
(kód)
Overenie použitia statickej premennej triedy. Z kontextu objektu je
nedostupná. Dá sa použit uvedením mena triedy, napr. : CA::$p=7;
Použitie rovnomennej premennej z kontextu objektu má ten istý efekt
ako použitie neexistujúcej premennej.
-
03/03_staticpA.php -
(kód)
Overenie použitia chránenej (protected) statickej premennej triedy.
Z kontextu objektu je premenná nedostupná.
-
03/03_staticpB.php -
(kód)
Overenie použitia súkromnej (private) statickej premennej triedy.
Z kontextu objektu je premenná nedostupná.
-
03/04_staticfA.php -
(kód)
Overenie použitia statickej funkcie triedy. V statickej funkcii nie je
možné používat "nestatické" clenské premenné triedy.
-
03/04_staticfB.php -
(kód)
To isté ako predošlý príklad, ale "problémový" riadok je v komentári.
^^
PC REVUE 8/2004: PHP5 je vo finále časť 4.
Statické členy triedy a dedičnosť
Dna 13.7.2004 bola uverejnená finálna verzia PHP5.0.0.
Preto názov seriálu "PHP5 ide do finále" bol aktualizovaný na
"PHP5 je vo finále".
V článku je pokračovanie overovania možností statických premenných a
funkcií triedy so zameraním na ich použitelnosť v rozširujúcej triede.
Sú navrhnuté skripty, ktorých poslaním je poskytnúť možnosť experimentálne
overiť rôzne možnosti prístupu k statickým členom rodičovskej triedy, ako
aj zistiť možnosti pre predefinovanie statických členov v odvodenej triede.
Uvedený je aj príklad s definíciou a s použitím konštanty triedy.
Príklady
-
04/01_staticd.php -
(kód)
Overenie možnosti prístupu k statickým členom triedy prostredníctvom
objektu rozširujúcej triedy.
-
04/02_staticd_x.php -
(kód)
Predefinovanie verejnej premennej $x triedy CA v odvodenej triede CB.
Skutočné využitie rovnomenných premenných v základnej a rozširujúcej
triede nedáva na prvý pohľad zmysel, ale skriptovací stroj proti tomu
"nenamieta" vydaním chybového hlásenia ani žiadnym iným upozornením.
-
04/03_staticd_x.php -
(kód)
Neúspešný pokus o prístup k rodičovskej členskej premennej príkazom
parent::$x="rodičovské x"; Vedie to k chybe:
Access to undeclared static property ...
-
04/04_staticd_p.php -
(kód)
Predefinovanie statickej premennej v odvodenej triede vedie k chybe:
Cannot redeclare property static public CA::$p ...
-
04/05_staticd_p1.php -
(kód)
Definovanie novej staticke premennej v odvodenej triede nevedie k chybe.
V triede CB je definovaná statická premenná $p1.
-
04/06_staticd_F.php -
(kód)
Predefinovanie verejnej funkcie v odvodenej triede funguje podľa
očakávania. Je ukázané, že v rozširujúcej triede je možné urobiť prístup
k statickej premennej rodičovskej triedy s uvedením kľúčového slova
parent.
-
04/07_staticd_FS.php -
(kód)
Ani s predefinovaním statickej funkcie nie sú v odvodenej triede žiadne
problémy. Sú ukázané možnosti prístupu k rovnomenným statickým funkciám
základnej a rozširujúcej triedy.
-
04/08_const.php -
(kód)
Príklad ukazuje definovanie aj použitie konštanty triedy. V zdrojom
kóde príkladu sú v komentári programové konštrukcie, ktoré vedú k
chybám. Je tam aj text chybového hlásenia.
^^
PC REVUE 9/2004: PHP5 je vo finále časť 5.
Abstraktné triedy a interfejsy
K abstrakným triedam a interfejsom vedie cesta cez poznanie dvoch základných
možností opakovaného využitia existujúceho kódu - dedičnosti a kompozície.
Príklady
-
05/01_dedicnost.php -
(kód)
Trieda CA má konštruktor a funkciu FA. Je rodičovskou triedou
triedy CB, ktorá má funkcie FB a FX. Vo funkcii FX je volaná funkcia
FA rodiča. Sú vytvorené inštancie oboch tried a volané ich metódy.
-
05/02_kompozicia.php -
(kód)
Ten istý výsledok, ktorý bol v predošlom príklade dosiahnutý
využitím dedičnosti, je tu dosiahnutý kompozíciou. Trieda CB nerozširuje
triedu CA, ale má členskú premennú $A - objekt triedy CA. Tento objekt
je získaný z argumentu konštruktora. Trieda CB má funkcie FB a FX. Vo
funkcii FX je členská premenná $A využitá pre volanie metódy FA triedy
CA. Aj tu sú vytvorené inštancie oboch tried a volané ich metódy.
-
05/02_kompoziciaX1.php -
(kód)
Tento príklad ukazuje nástrahy kompozície. Konštruktoru
triedy CB nie je odovzdaný objekt triedy CA, ale číslo 77. Je to zjavná
chyba, ale skriptovací stroj "neprotestuje".
-
05/02_kompoziciaX2.php -
(kód)
To isté ako predošlý príklad, ale je volaná metóda FA. Tú by mal
sprostredkovať objekt triedy CA, ale my sme konštruktoru triedy CB
taký objekt neodovzdali. Skriptovací stroj oznámi osudnú chybu -
fatal error.
-
05/03_TestArg.php -
(kód)
Prekonanie nástrah kompozície umožnuje overenie preberaných parametrov.
V konštruktore triedy CB s využitím operátora instanceof,
(bol zavedený v PHP5) je overené, či argument je objektom triedy CA.
Ak nie - skript sa nechá "odumrieť" - die.
-
05/04_TypArg.php -
(kód)
Vhodnejšie riešenie, než testovanie argumenta, je možnosť určenia
typu argumentu. O preverenie typu odovzdávaného argumentu sa postará
skriptovací stroj.
-
05/05_Abstract.php -
(kód)
Príklad ukazuje abstraktnú triedu CA a dve triedy CA1 a CA2, ktoré
rozširujú túto abstraktnú triedu. Každá z tried CA1 a CA2 musí mať
funkciu FA, ktorá je v triede CA predpísaná ako abstraktná funkcia.
Použitá je aj trieda CB, ktorá v konštruktore preberá argument typu
CA. Sú vytvorené dva objekty triedy CB. Pri vytváraní prvého je
konštruktoru odovzdaný objekt triedy CA1, druhého - objekt triedy CA2.
-
05/05_AbstractX.php -
(kód)
Potomok abstraktnej triedy musí implentovať všetky abstraktné funkcie
rodiča. Ak tomu tak nie je, skriptovací stroj oznámi fatal error. Tak
je to aj v tomto príklade.
-
05/06_Interface.php -
(kód)
Príklad ukazuje definovanie dvoch rozhraní - interfejsov I1, I2. Každý
z nich obsahuje jednu funkciu. Je tu aj abstraktná trieda CA. Trieda
CA1 rozširuje triedu CA a implementuje interfejsy I1, I2. Vytvorený
objekt $A1 ukazuje použitie abstraktnej funkcie FA ako aj funkcií
oboch rozhraní.
-
05/06_InterfaceX.php -
(kód)
Trieda implementujúca rozhranie musí definovať všetky funkcie, ktoré
dané rozhranie predpisuje. Ak nie - skriptovací stroj osnámi chybu. V
tomto príklade nie je implementovaná druhá z funkcií rozhrania I1.
^^
PC REVUE 10/2004: PHP 5 časť 6.
Klonovanie, priestory mien a výnimky
V tomto článku sú opísané jednoduché pokusné skripty, ktoré dávajú možnosť
overiť (a možno aj pochopiť) klonovanie objektov, použitie priestorov mien
a obsluhu výnimiek.
Príklady
-
06/01_klonovanie1.php -
(kód)
Klonovanie objektu znamená možnosť vytvorenia jeho vernej kópie. Tento
príklad ukazuje tri prípady:
Priradenie - pomocou dvoch premenných sa manipuluje
s tým istým objektom,
Dva objekty - sú vytvorené dva rôzne objekty,
Klonovanie - je vytvorený klon objektu.
Pre klonovanie bola použitá funkcia clone. Použitie __clone objektu
bolo neúspešné.
-
06/01_klonovanie2.php -
(kód)
To isté, čo v predošlom príklade, ale boli urobené pokusy pre implementáciu
funkcie __clone v triede - neúspešne. Je však možné vytvoriť svoju vlastnú
funkciu, ktorá bude vytvárať jej klon - pozri zdrojový kód a komentáre v
ňom.
-
06/02_namespace1.php -
(kód)
Podľa niektorých zdrojov mali byt v PHP 5 implementované priestory mien.
Ich použitie ukazuje tento príklad. Žiaľ, v konečnom riešení bolo od
priestorov mien upustené. Preto tento príklad vedie k chybe.
-
06/02_namespace2.php -
(kód)
Riešením by mohlo byť, ak by sme mohli vytvoriť triedu v triede. Ale to
vedie k chybe - pozri zdrojový kód príkladu.
-
06/02_namespace3.php -
(kód)
Riešenie, ktorým je možné čiastocne nahradiť priestor mien
neúspešne vytváranom v predošlých príkladoch.
-
06/03_vynimky1.php -
(kód)
Otvorenie neexistujúceho súboru ani delenie nulou nevyhadzuje výnimku :-(
-
06/03_vynimky2.php -
(kód)
Vyhodenie výnimky pri otváraní súboru musíme urobiť sami. Tu je urobené priamo
v bloku try. Všimnite si, že príkaz exit ukončí skript tak, že v ňom
nebudú záverecné značky </div></body></html>
(porovnaj kód skriptu a vygenrovaný HTML kód zobrazený prehliadačom cez
menu Zobraziť - Zdrojový kód).
-
06/03_vynimky3.php -
(kód)
Aj delenie nulou musíme ošetriť sami. Tu je to v procedúre, ktorá je
mimo bloku try.
-
06/03_vynimky4.php -
(kód)
Tento ani nasledujúci príklad v článku nie je opísaný. Nuž ono je to tak,
keď na papieri je málo miesta a dvojstrana v časopise je až príliš veľa.
Ale priznajme si, kto z nás má rád dlhé články? Opis týchto príkladov
preto bude až v nasledujúcom čísle PC REVUE. Je to o vytvorení svojej
vlastnej triedy odvodenenj od Exception. A preto je toto tu bez
komentára. Kto vie čítať zdrojovky ich ani nepotrebuje.
-
06/03_vynimky5.php -
(kód)
V porovnaní s predošlým príkladom je tu iná postupnosť príkazov vedúcich
k výnimkám. Cieľom bolo overiť, ako je to s viacerými blokmi catch.
V zdrojovkách je na konci získaný výsledok, a tak sa to dá študovať aj
na serveri, na ktorom nebeží PHP 5.
^^
PC REVUE 11/2004: PHP 5 časť 7.
Práca s údajmi zapísanými v XML
XML je jazyk, ktorý nachádza neustále širšie uplatnenie. Práca s údajmi
zapísanými v tomto jazyku je preto nevyhnutnosťou. Existujú rôzne metódy,
ako vyhľadať v XML dokumente potrebné údaje. V tomto článku sú predstavené
SAX, DOM, XPath a SimpleXML. Použité sú pre získanie kurzu zadanej meny
z kurzového lístka Národnej banky Slovenska
07/aktklsl.xml.
Riešenie spočíva vo vytvorení tried CKurzXXX, kde namiesto XXX je skratka
použitej metódy.
Príklady
-
07/KurzySAX.php -
(kód)
SAX - Simple API for XML aj napriek prísľubu jednoduchosti (slovo Simple
v názve) neposkytuje jednoduché riešenie. Je to preto, lebo treba
vytvoriť funkcie, ktoré volá parser a ktoré realizujú stavový automat.
-
07/KurzyDOM.php -
(kód)
DOM - Document Object Model je implementáciou rovnomenného odporúčania
W3C. To ponúka množinu objektov. Prostredníctvom ich metód a vlastností
je možné z XML súboru získať potrebné údaje. Základom je objekt typu
DomDocument.
-
07/KurzyDOM1.php -
(kód)
Iné riešenie s využitím metódy DOM.
-
07/KurzyXPath.php -
(kód)
XPath je odporúčanie W3C, ktoré definuje pravidlá vytvorenia výrazu pre
výber podmnožiny z XML dokumentu. Ten sa uplatní na objekt typu DomDocument.
-
07/KurzyXPath1.php -
(kód)
Ešte jedno riešenie - iná podmienka výberu a získanie objektu rodičovského
prvku.
-
07/KurzySimpleXML.php -
(kód)
SimpleXML - novinka zavedená v PHP 5. Zavedením XML súboru získame
objekt, ktorého vlastnosti majú názvy zhodné s názvami prvkov XML
súboru.
^^
PC REVUE - príloha INFOWARE 12/2004: PHP 5 časť 8.
SQLite - odľahčená databáza
Doteraz sa v súvislosti s PHP veľmi často objavoval databázový stroj
MySQL. S príchodom PHP 5 sa zrejme bude objavovať SQLite - odľahčená
databáza, ktorá je súčasťou jadra skriptovacieho stroja. V PHP manuáli
je dokumentácia funkcií sqlite_*, ktoré umožňujú s touto databázou
pracovať. Existuje však aj možnosť práce s touto databázou využitím
objektov SQLiteDatabase, SQLiteResult a SQLiteException. K nim však v
PHP manuáli nie je dokumentácia. Ich overenie je predmetom tohto článku.
Tu nájdete príklady, ktoré boli pri tom použité. Údaje, ktoré SQLite
sprevádzajú, hovoria o tom, že je v nej implementovaná podmnožina
normy dopytovacieho jazyka SQL 92.
Príklady
^^
INFOWARE 1/2005: PHP 5 časť 9.
Vylepšené rozhranie s MySQL
V prípade zložitejších aplikácií zrejme tak ako doteraz bude mať význam
uvažovať s kombináciou PHP 5 - MySQL. Databázový stroj MySQL je dostatočne
rozšírený a preto, má odporcov ale aj stúpencov. Medzi stúpencami sa určite
nájdu takí, ktorí sa budú aj po zavedení PHP 5 spoliehať na MySQL. Tu si
však budú môcť vybrať - použiť doterajšie rozhranie k databázovému stroju,
ktoré poskytuje rozšírenie s funkciami mysql_*, alebo vsadiť na vylepšené
rozhranie, ktoré prichádza v podobe rozšírenia mysqli. Nenápadné malé i
na konci môže byť odvodené od anglických slov: interface - rozhranie,
ingenious - dômyselný, ale aj incompatible - nekompatibilý a
incomplete - neúplný. V každom prípade však stojí za vyskúšanie. Ponúka
nielen funkcie, ale aj objekty.
Príklady
-
09/KukMySQLi_01.php -
(kód)
Použitie funkcií mysqli. V zdrojovom tekte príkladu nájdete v komentári
opis postupu vytvorenia databázy aj zápis pokusných záznamov.
-
09/KukMySQLi_02.php -
(kód)
Použitie objektov:
mysql - reprezentuje spojenie s databázovým spojom,
mysql_result - reprezentuje vybrané údaje z databázy,
mysql_stmt - reprezentuje preddefinovaný príkaz (statement).
-
09/KukMySQLi_03.php -
(kód)
Zviazanie výsledku s premennými. Umožňuje to metóda
bind_result objektu mysql_stmt.
-
09/KukMySQLi_04.php -
(kód)
Parametrizovaný výber. Umožňuje to metóda
bind_param objektu mysql_stmt.
Hodnotou obsahu premennej - parametra sa nahradí otáznik v textovom
reťazci SQL dopytu. Prvý argument metódy určuje typ údaja v databáze.
Postupnosťou znakov v reťazci "idbs" určuje, že prvý parameter
je i - celé číslo, druhý d - číslo v pohyblivej rádovej čiarke
(DOUBLE, FLOAT), tretí b - veľký binárny objekt (BLOB), štvrtý
s - ľubovoľný iný typ, teda aj textový reťazec.
^^
INFOWARE 2/2005: PHP 5 časť 10.
Podpora pre webové služby
Podpora pre webové služby má v PHP 5 podobu rozšírenia SOAP. Už v
predošlých verziách PHP bola možnosť použiť SOAP. Jednalo sa o
implementácie vytvorené priamo v jazyku PHP, napr.
PEAR::SOAP (http://pear.php.net) alebo
NuSOAP (http://dietrich.ganx4.com/nusoap).
S piatou verziou PHP prichádza rozšírenie, ktoré je vytvorené v
programovacom jazyku C. Vo verzii PHP5 pre Windows
je k dispozícii v podobe php_soap.dll.
Príklady
-
10/Klient1.php -
kód servera,
opis služby v jazyku WSDL,
kód klienta.
V kóde skriptu pre stranu servera je implementovaná "službutvorná"
trieda SluzbaSkratky s funkciou Vyznam. V jazyku WSDL je opis tejto triedy ako webovej
služby. V kóde klientského skriptu je vytvorený objekt triedy SoapClient.
Argumentom konštruktora je opis webovej služby - WSDL dokument.
V skripte servera je podobne vytvorený objekt triedy SoapServer. Ten
obslúži príchodziu požiadavku od klienta a odovzdá mu výsledok.
-
10/Klient2.php -
kód servera,
opis služby v jazyku WSDL,
kód klienta.
Pôvodná webová služba je rozšírená o novú funkciu. Pre to bolo treba
rozšíriť službutvornú triedu o novú funkciu - Pocet. Bol rozšírený
opis webovej služby v jazyku WSDL a modifikovaný kód klienta.
^^
V Liptovskom Mikuláši
Imrich Buranský