Upload
vvinston
View
3.588
Download
1
Embed Size (px)
Citation preview
Objektum-
Orientált
fejlesztés PHP
nyelvenSimon Bence
Docler Akadémia
2011-01-18
Miről is lesz itt ma szó?
Magic Method-ok
Interface-k
Kivételkezelés
Standard PHP Library
Tervezési minták
Műveletek objektumokkal
Reflection API
Egységtesztelés
Magic Method-ok
Speciális helyzetekben, automatikusan
hívódó metódusok
Hasonlóak az EJB életciklus
metódusokhoz, de itt nincs annotáció
A __ névtér van fenntartva számukra
MM Életciklus metódusok
Objektumok élete során hívódnak meg
automatikusan
__construct
Osztály példányosításakor hívódik meg.
__destruct
A GC hívja meg
Nem lehetünk biztosak benne
MM Entitás-kezelés setter/getter metódusokat lehet velük
gyártani
__set Setter metódus
__get Getter metódus
__isset Isset vizsgálat metódusa
__unset Attribútum törlése
MM Entitás-kezelés példa
MM Serializálás Ezek különböző hook-ok, melyeket a serializálás hív
meg, amennyiben léteznek
__sleep Hasonlóan a Java „transitive” módosítójához:
megszűri az attribútumokat, és lezárja a kapcsolatokat
__wakeup Db kapcsolatok, stb. visszaállítása, amik elvesznek
a mentés során
__set_state Osztály var_export-jakor hívódik meg, a kimenetét
alakítja át
MM Metódushívások
Nem létező metódusok hívásakor lefutó
magic method-ok
__call
Nem létező tagmetódus esetén
__callStatic
Nem létező statikus metódus esetén
__invoke
Függvényként hívódó osztály esetén
MM Ésatöbbi
__autoload
Nem betöltött osztály esetén hívódik
__clone
Klónozásnál hívódik meg, segít az újonnan létrejött osztály paraméterezésében
__toString
Ha egy objektumot string-ként próbálunk kezelni, itt állíthatunk össze string (!) kimenetet
Interface-k
Implementáció nélküli (publikus)
metódusok és konstansok deklarációja
Átjárhatóságot valósít meg
Interface-re programozás
Interface
referencia
használata
Typehint
használata
Interface példa
Kivételkezelés
OOP hibakezelési mód
Tisztán tartja a kódot
Szeparálja a nem várt eseményeket
Vezérlésátadással a hibakezelés a
megfelelő helyen végezhető el
Származtatott kivételek
Az Exception
osztály
leszármaztatható
A catch blokk „IS
A” vizsgálatot
végez, és csak az
első igaz feltételbe
megy bele
Továbbdelegált kivételek
A kivételt nem
kötelező az adott
blokkban lekezelni
(vagy egyáltalán
lekezelni)
Ha nincs elkapva,
a hívási fán felfele
delegálódik
Standard PHP Library
Interface-k és osztályok gyűjteménye
Standard megoldások
Nincs szükség külső extension-ra
Java SDK-hoz hasonlóan
SPL Iterátorok
Összetett objektum bejárására szolgáló
algoritmusok
Tervezési minta
23 iterátor implementációt tartalmaz
Példák: ArrayIterator, DirectoryIterator,
EmptyIterator, RecursiveArrayIterator,
SimpleXMLIterator, CachingIterator
SPL Adatstruktúrák
Az SPL biztosítja néhány elterjedt
adatstruktúra implementációját
Például: SplStack, SplQueue (duplán
láncolt listával), SplHeap (Min és Max
változattal is), SplObjectStorage,
SplDoublyLinkedList
SPL Kivételek
Az SPL biztosít néhány „szabványos”
kivételt az általános esetekre
Például: BadMethodCallException,
InvalidArgumentException,
OutOfRangeException,
RuntimeException, LogicException,
OverflowException
SPL ArrayObject
Wrapper osztály
Objektumokat lehet tömbként kezelni a
segítségével
SPL Autoload Dinamikus osztálybetöltő mechanizmus
Az SPL biztosít hozzá felületet, amelyen keresztül befolyásolható
Funkciók:
spl_autoload_call
spl_autoload_extensions
spl_autoload_functions
spl_autoload_register
spl_autoload_unregister
spl_autoload
Tervezési minták
Általános problémákra adnak általános
megoldásokat
Nyelvtől független
Jól bejáratott szakmai eszköztár
MVC (Model-View-Controller)
Architektúrális
minta
Felosztja a kódot
Különböző
felelősséget ruház
a részekre
Singleton
Létrehozó minta
Biztosítja, hogy egy
entitásból csakis és
kizárólag egy
létezzen
(Depricated)
Singleton példa
Factory method
Létrehozó minta
A nélkül hozza létre
az entitást, hogy a
valós osztályát
ismernünk kéne
(interface)
Factory példa
Adapter
Strukturális minta
Egy adott osztályt
hozzáilleszt egy
adott felülethez
Adapter példa
Műveletek objektumokkal:
Összehasonlítás
Egymással
Állapotok összehasonlítása
Referenciák összehasonlítása
Osztályokkal (és interface-kkel)
is_a, instanceof, get_class,
get_parent_class, is_subclass_of
Műveletek objektumokkal:
Másolás
Új referencia létrehozása
Klónozás
Shallow copy (default): az attribútum
objektum-mutatója másolódik le: ugyan
arra az objektumra mutat, mint az eredeti
Deep copy: az attribútum objektum
állapota másolódik le
Műveletek objektumokkal:
Iteráció
Mindig a láthatóság szabályainak
megfelelően
Reflection API
Osztályok és függvények gyűjteménye
Nincs szükség külső extension-ra
Az OOP szabályainál nagyobb
hozzáférést nyújtanak a rendszer részeihez
Reverse-engineering-hez kiváló
Reflection API részei
ReflectionClass: az osztályokról
ReflectionFunction: a funkciókról
ReflectionMethod: az osztálymetódusokról
ReflectionObject: az objektumokról
ReflectionParameter: hívási paraméterről
ReflectionProperty: az attribútumokról
…
Reflection API függvények
isProcected
getName
isAbstract
isUserDefinied
isOptional
getDocComment
hasMethod
getConstants
getStartLine
getFileName
setAccessible
getMethod
getParentClassexport
getDefaultValue
Egységtesztelés
A komplex munka minden esetben
hibával jár
A hibák számát és hatását minimalizálni
kell
Vállalati standard: 15-50 defektus / KLOC
Ennek költséghatékonynak kell lennie
Egységtesztelés
Ha a részek jók, akkor a részek egésze is
lehet jó
Az egységbezárás lehetőséget ad arra,
hogy a részeket teszteljük
Eszköz: egységtesztelés
PHP Unit
Sebastian Bergmann (thePHP.cc)
Xunit család
De facto PHP szabvány
Könnyen telepíthető és kezelhető
Assert-ekkel dolgozik
Pl.: assertArrayHasKey, assertEquals,
assertFalse, assertFileExists, assertGraterThan,
assertNull, assertRegExp, assertStringStartsWith
PHP Unit példa
Ez persze nem elég
Tipikus hibák
Nem megfelelő erőforrás-ráfordítás
Lefedettség
Immunissá válás
Többszörös hiba
Kontextus függőség
Köszönöm!Kérdések?