41
Objektum- Orientált fejlesztés PHP nyelven Simon Bence Docler Akadémia 2011-01-18

Objektum-orientált fejlesztés PHP nyelven (2. rész)

Embed Size (px)

Citation preview

Page 1: Objektum-orientált fejlesztés PHP nyelven (2. rész)

Objektum-

Orientált

fejlesztés PHP

nyelvenSimon Bence

Docler Akadémia

2011-01-18

Page 2: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 3: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 4: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 5: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 6: Objektum-orientált fejlesztés PHP nyelven (2. rész)

MM Entitás-kezelés példa

Page 7: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 8: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 9: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 10: Objektum-orientált fejlesztés PHP nyelven (2. rész)

Interface-k

Implementáció nélküli (publikus)

metódusok és konstansok deklarációja

Átjárhatóságot valósít meg

Page 11: Objektum-orientált fejlesztés PHP nyelven (2. rész)

Interface-re programozás

Interface

referencia

használata

Typehint

használata

Page 12: Objektum-orientált fejlesztés PHP nyelven (2. rész)

Interface példa

Page 13: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 14: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 15: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 16: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 17: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 18: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 19: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 20: Objektum-orientált fejlesztés PHP nyelven (2. rész)

SPL ArrayObject

Wrapper osztály

Objektumokat lehet tömbként kezelni a

segítségével

Page 21: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 22: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 23: Objektum-orientált fejlesztés PHP nyelven (2. rész)

MVC (Model-View-Controller)

Architektúrális

minta

Felosztja a kódot

Különböző

felelősséget ruház

a részekre

Page 24: Objektum-orientált fejlesztés PHP nyelven (2. rész)

Singleton

Létrehozó minta

Biztosítja, hogy egy

entitásból csakis és

kizárólag egy

létezzen

(Depricated)

Page 25: Objektum-orientált fejlesztés PHP nyelven (2. rész)

Singleton példa

Page 26: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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)

Page 27: Objektum-orientált fejlesztés PHP nyelven (2. rész)

Factory példa

Page 28: Objektum-orientált fejlesztés PHP nyelven (2. rész)

Adapter

Strukturális minta

Egy adott osztályt

hozzáilleszt egy

adott felülethez

Page 29: Objektum-orientált fejlesztés PHP nyelven (2. rész)

Adapter példa

Page 30: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 31: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 32: Objektum-orientált fejlesztés PHP nyelven (2. rész)

Műveletek objektumokkal:

Iteráció

Mindig a láthatóság szabályainak

megfelelően

Page 33: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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ó

Page 34: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 35: Objektum-orientált fejlesztés PHP nyelven (2. rész)

Reflection API függvények

isProcected

getName

isAbstract

isUserDefinied

isOptional

getDocComment

hasMethod

getConstants

getStartLine

getFileName

setAccessible

getMethod

getParentClassexport

getDefaultValue

Page 36: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 37: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 38: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 39: Objektum-orientált fejlesztés PHP nyelven (2. rész)

PHP Unit példa

Page 40: Objektum-orientált fejlesztés PHP nyelven (2. rész)

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

Page 41: Objektum-orientált fejlesztés PHP nyelven (2. rész)

Köszönöm!Kérdések?