PHP Manuál | ||
---|---|---|
Predchádzajúci | Dodatok B. Migrácia z PHP 4 na PHP 5 | Nasledujúci |
V PHP 5 je nový Model Objektov. Zaobchádzanie s objektami v PHP bolo kompletne prepísané, umožňujúc tak lepší výkon a viac vlastností. V predošlej verzii PHP boli objekty chápané ako primitívne typy (napr. integere a stringy). Nevýhodou tejto metódy bolo, že sa celý objekt sémanticky skopíroval pri priradení premennej alebo sa metóde poslala ako parameter. Po novom sú objekty odkazované cez handle a nie hodnotu (handle si môžete predstaviť ako idetifikátor objektu).
Mnoho PHP programátorv sa neobáva problému kopírovania starého modelu objektov, a preto väčšina PHP aplikácii bude fungovať mimo počítača alebo len s málo modifikáciami.
PHP 5 predstavuje členské premenné private a protected, umožňujú vám definovať viditeľnosť vlastností triedy.
Spolu s PHP 5 boli predstavené aj metódy private a protected.
Príklad B-5. Príklad metódy Protected
|
Starý kód, ktorý nemal žiadne užívateľom definované triedy alebo funkcie nazvané "public", "protected" alebo "private" by mal bežať bez modifikácii.
PHP 5 tiež predstavuje triedy a metódy abstract. Metóda abstract deklaruje iba signatúru metódy a neposkytuje implementáciu. Trieda, ktorá obsahuje metódy abstract musí byť deklarovaná ako abstract.
Triedy Abstract nemôžu byť inštanciované. Starý kód, ktorý nemá žiadne užívateľom definované triedy alebo funkcie nazvané 'abstract' by mal bežať bez modifikácii.
PHP 5 predstavuje rozhrania. Trieda môže implementovať ľubovoľný zoznam rozhraní.
Starý kód, ktorý nemá žiadne užívateľom definované triedy alebo funkcie nazvané 'interface'alebo 'implements' by mal bežať bez modifikácii.
PHP 5, stále voľne typové, predstavuje schopnosť použiť Typové hinty triedy na deklarovanie očakávanej triedy objektov, ktoré sú poslané metóde ako parametre.
Teto typové hinty triedy sa nekontrolujú počas kompilácie, ako by to bolo v prípade typových jazykov, ale počas runtime. To znamená, že:
je zhodné s:
PHP 5 predstavuje kľúčové slovo "final" na deklarovanie členov a metód final. Metódy a členovia deklarovavý ako final sa nemôžu preťažiť sub-triedami.
Ba čo viac, je možné vytvoriť triedy final. Toto zabraňuje triede byť špecializovanou (nemôže byť zdedená inou triedou). Nie je nutné samotné metódy triedy final deklarovať ako final.
Vlastnosti nemôžu byť final-ne.
Starý kód, ktorý nemal žiadne užívateľom definované triedy alebo funkcie nazvané 'final' by mal bežať bez modifikácii.
PHP 4 neponúkalo žiadny spôsob, akým by užívateľ mohol rozhodnúť, ktorý kopírovací conštruktor spustiť pri zdvojení objketu. Počas duplikácie, PHP 4 kopírovalo bit po bite tvoriac tak identickú repliku všetkých vlastností objektu.
Tvorba kópie objektu s plne replikovaými vlastnosťami nie je vždy žiadaným správaním. Dobrým príkladom potreby kopírovaích konštruktorov je, ak máte objekt, ktorý reprezentuje GTK okno a objekt drží zdroj tohto GTK okna, keď vytvárate duplikát, môžete chcieť vytvoriť nové okno s rovnakými vlastnosťami a mať nový objekt, ktorý drží zdroj nového okna. Ďalším príkladom je, ak váš objekt drží odkaz na ďalší objekt, ktorý on používa a keď replikujete rodičovský objekt, chcete vytvoriť novú inštanciu tohto druhého objektu, takže replika má svoju vlastnú oddelenú kópiu.
Kópia objektu je vytvorená pomocou kľúčového slova clone (ktoré volá, ak je to možné, metódu __clone() objektu). Metóda __clone() objetku sa nedá volať priamo.
Keď developer žiada vytvorenie novej kópiu objektu, PHP 5 skontroluje, či bola metóda __clone() definovaná alebo nie. Ak nie, zavolá východziu __clone(), ktorá skopíruje všetky vlastnosti objektu. Ak bola metóda __clone() definované, potom bude zodpovedná za nastavenie nutných vlastností vo vytvorenom objekte. Engine vhodne dodá funkciu, ktorá importuje všetky vlastnosti zo zdrojového objektu, takže môžu začať s by-value replikou zdrojového objektu a prelomiť vlastnosti, ktoré sa musia zmeniť.
Príklad B-11. Klonovanie objektov
|
PHP 5 umožňuje developerom deklarovať metódy konštruktora pre triedy. Triedy, ktoré majú metódu konštruktora, volajú túto metódu pri každom novo-vytvorenom objekte, takže je vhodná pre akúkoľvek incializáciu, ktorú objekt môže potrebovať pred tým, než je je použitý.
V PHP 4 metódy konštruktora boli metódy triedy, ktoré mali rovnaký názov ako trieda samotná. Nakoľko je veľmi bežné volať rodičovský konštruktor z odvodených tried, spôsob, ako PHP 4 fungovalo, bol troška krkolomý na presúvanie tried vo veľkej hierarchii tried. Ak sa trieda presunula pod iného rodiča, názov konštruktora toho rodiča sa zmení tiež a kód v odvodenej triede, ktorá volá rodičovského konštruktora, sa tiež zmenil.
PHP 5 predstavuje štandardný spôsob deklarovania metód konštruktora ich volaním pomocou názvu __construct().
Príklad B-12. Používanie novo unifikovaných konštruktorov
|
Kvôli spätnej kompatibilite, ak PHP 5 nedokáte nájsť funkciu __construct() pre danú triedu, vyhľadá funkciu konštruktora starého štýlu, podľa názvu triedy. Z hľadiska efektivity to znamená, že jediný prípad, ktorý by mal problémy kompatibility je, ak trieda nemala metódu nazvanú __construct(), čo bolo použité pre odlišnú sémantiku.
Mať schopnosť definovať deštruktory pre objekty môže byť veľmi užitočné. Deštruktory dokážu sledovať správy pre ladenie, zatvárať databázové spojenia a robiť iné čistiace práce. V PHP 4 neexistoval žiadny mechanizmus pre deštruktory objektov, i keď PHP už malo podporu pre registrovanie funkcii, ktoré sa malo spustiť pri požadovanom vypnutí.
PHP 5 predstavuje koncept deštruktorov podobný tomu v iných objektovo orientovaných jazykoch, ako je Java: Ak sa zničí posledný odkaz na objekt, zavolá sa deštruktor objektu, ktorý je metódou triedy nazvanou __destruct(), ktorá neprijíma žiadne parametre, pred tým, než sa objekt uvoľní z pamäte.
Podobne ako konštruktory, rodičovské deštruktory nebudú volané implicitne engine-om. Aby sa pustil rodičovský deštruktor, musí sa explicitne zavolať parent::__destruct() v tele deštruktora.
PHP 5 predstavujes triedne konštanty:
Starý kód, ktorý nemá žiadne užívateľom definované triedy alebo fukcie nazvané 'const' bude bežať bez modifikácii.
PHP 4 nemalo žiadne riadenie výnimiek. PHP 5 predstavuje model výnimiek podobný tomu v iných programovacích jazykoch. Pozor na fakt, že existuje podpora pre "catch all", ale nie pre klazulu "finally".
Výnimky sa dajú viackrát thrown-úť v catch blokoch. Tiež je možné mať viacnásobné catch bloky. V takom prípade sa zachytená výnimka porovná s typom triedy každého catch bloku od hora na dol a prvý blok, ktorý sa zhoduje s 'instanceof', sa spracuje. Keď sa catch blok ukončí, spracovanie pokračuje na konci posledného catch bloku. Ak sa žiadny catch blok nezhoduje s 'instanceof', potom sa hľadá ďalší try/catch blok až pokiaľ ďalšie try/catch bloky nie sú dostupné. V takom prípade je výnimka nezachytenou výnimkou a program sa ukončí zobrazením výnimky.
Starý kód, ktorý nemá žiadne užívateľom definované triedy alebo funkcie 'catch', 'throw' a 'try' bude bežať bez modifikácii.
V PHP 4 nebolo možné dereferencovať objekty vrátené funkciami a urobiť ďalšie volania metódy na tieto objekty. S PHP 5 je možné následujúce:
Príklad B-16. Príklad dereferencie
|
Premenné statických členov statických tried sa môžu teraz inicializovať.
PHP 5 predstavuje kľúčové slovo 'static' na deklaráciu statický metód, teda volateľných mimo kontextu objektu.
Pseudo premenná $this nie je dostupná vo vnútri metódy, ktorá bola deklarovaná ako static.
PHP 5 predstavuje kľúčové slovo instanceof, ktoré vám umožňuje zistiť, či objekt je alebo nie je inštanciou triedy, alebo či rozširuje triedu alebo implementuje rozhranie.
Static-y sa teraz spracovávajú počas kompilácie, čo developer umožňuje priradiť premenné k static-om pomocou referencie. Táto zmena veľkolepo zlepšuje ich výkon, ale znamená, že nepriame odkazy na static-y nebude viac fungovať.
Parametre, ktoré sú poslané referenciou funkcii môžu teraz mať východzie hodnoty
Zachytávacia funkcia __autoload() bude automaticky volaná, keď sa má nedeklarovaná trieda inštanciovať. Názov tejto triedy sa pošle zachytávacej funkcii __autoload() ako jej jediný argument.
Obe, volania metód a prístupy vlastností sa dajú preťažiť cez metódy __call(), __get() a __set().
Príklad B-22. __get() a __set()
|
Objekty sa môžu iterovať spôsobom preťaženia, pri použití s foreach. Východzie správanie je iterovať cez všetky vlastnosti.
Každá trieda, ktorej inštancie sa dajú iterovať s foreach by mala implementovať prázdne rozhranie Traversable. Teda každý objekt, ktorý hovorí, že implementuje Traversable sa môže použiť s foreach.
Rozhrania IteratorAggregate a Iterator vám umožňujú určiť ako sa objekty triedy iterujú v PHP kóde. Prvý z nich má metódu getIterator(), ktorá musí vrátiť pole alebo objekt, ktorý buď implementuje rozhranie Iterator alebo je inštaniciovaný z internej triedy, ktorá môže byť iterovaná
Príklad B-25. Príklad tvorby Iterátora
|
Nová pseudo konštanta __METHOD__ ukazuje aktuálnu triedu a metódu, keď sa použije vo vnútri metódy a funkciu, keď sa použije mimo triedu.
Príklad B-26. Príklad použitia __METHOD__
|
Nová zázračná metóda __toString() vám umožňuje preťažiť objekt na konverziu reťazca.
PHP 5 prichádza s kompletnou API reflexiou, ktorá pridáva schopnosť tvorbu-opančných tried, rozhraní, funkcíí a metód ronvako ako rozšírení.
Reflexné API tiež ponúkajú získanie doc komentárov pre funkcie, triedy a metódy.
Takmer všetky aspekty objektovo orientovaného kódu sa dajú reflektovať pomocou reflexného API, ktoré je zdokumentované oddelene.
Príklad B-28. Príklad použita reflexného API
|
Predchádzajúci | Domov | Nasledujúci |
Databázy | Hore | Error Reporting |