Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Podobné dokumenty
Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Objektově orientované programování v PHP 5. Martin Klíma

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Dědění, polymorfismus

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

typová konverze typová inference

PŘETĚŽOVÁNÍ OPERÁTORŮ

Generické programování

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

PREPROCESOR POKRAČOVÁNÍ

Jazyk C# (seminář 6)

Úvod do programovacích jazyků (Java)

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Výjimky a ošetřování chyb v PHP. Who is General Failure and why is he reading my disk?!

Programování II. Abstraktní třída Vícenásobná dědičnost 2018/19

Seminář Java IV p.1/38

Programování v C++ 1, 5. cvičení

PB161 Programování v jazyce C++ Přednáška 7

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

PB161 Programování v jazyce C++ Přednáška 9

PB161 Programování v jazyce C++ Přednáška 7

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Základy objektové orientace I. Únor 2010

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Více o konstruktorech a destruktorech

PB161 Programování v jazyce C++ Přednáška 4

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PB161 Programování v jazyce C++ Přednáška 4

návrhový vzor Singleton.

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Programování v C++ 2, 4. cvičení

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Principy objektově orientovaného programování

Reflexe. Aplikační programování v Javě (BI-APJ) - 8 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Virtuální metody - polymorfizmus

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Jazyk C++ I. Polymorfismus

Programování v C++ 1, 6. cvičení

Objektové programování

UJO Framework. revoluční architektura beans. verze

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Dědičnost (inheritance)

Jazyk C# (seminář 3)

Konstruktory a destruktory

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Teoretické minimum z PJV

Java Enum Java, zimní semestr ,2017 1

1. Programování proti rozhraní

Jazyk C++ I. Šablony 2

Komponenty v.net. Obsah přednášky

Výčtový typ strana 67

24. listopadu 2013, Brno Připravil: David Procházka

Programování II. Dědičnost změna chování 2018/19

Programování v jazyce JavaScript

Abstraktní třída a rozhraní

Kód, který se nebude často měnit

8 Třídy, objekty, metody, předávání argumentů metod

Seminář Java II p.1/43

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

3. Třídy. Základní pojmy objektového programování. Třídy

20. Projekt Domácí mediotéka

Chování konstruktorů a destruktorů při dědění

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

přetížení operátorů (o)

NMIN201 Objektově orientované programování 1 / :36:09

NPRG031 Programování II 1 / :25:46

PB161 Základy OOP. Tomáš Brukner

Programování v C++ 3, 3. cvičení

konstruktory a destruktory (o)

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Ukazka knihy z internetoveho knihkupectvi

IRAE 07/08 Přednáška č. 1

Návrhové vzory OMO, LS 2014/2015

State. Známý jako. Účel. Použitelnost. Stav, Object for States. umožňuje objektu měnit svoje chování v závislosti na stavu objekt mění svou třídu

9. Polymorfismus a rozhraní

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

Java Výjimky Java, zimní semestr

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

7.5 Diagram tříd pokročilé techniky

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

JavaScript 101. "Trocha života do statických stránek"

Programování v Javě I. Leden 2008

1. Dědičnost a polymorfismus

Transkript:

Objekty v PHP 5.x This is an object-oriented system. If we change anything, the users object.

Objektové PHP Objekty se poprvé objevili v PHP ve verzi 4. Nepříliš zdařilý pokus. Programátoři získali nedůvěru k OOP v PHP. Ve verzi 5 se konečně objevily použitelné objekty a třídy. Syntax a sémantika je blízká Javě nebo C#. Objekty jsou referenční typy. Neexistuje mechanismus pozdní vazby (virtuální metody). V PHP jsou všechny metody virtuální (interpretované). V kombinaci s některými vlastnostmi PHP lze vytvářet komplikovanější návrhové vzory, než v jiných jazycích. Např. dosazování hodnot proměnných do kódu: $obj = new $classname(); $obj->$methodname(); verze 1.1 2008-2009, Martin Kruliš 2

Základy syntaxe class Foo { public $var = 0; Deklarace členské proměnné Třída viditelnosti public function bar() { echo $this->var; Operátor pro vytváření instancí tříd Deklarace metody $instance = new Foo(); $instance->var = 42; $instance->bar(); $instance = null; verze 1.1 2008-2009, Martin Kruliš 3

Členské proměnné Členské proměnnémusí mít uvedenou třídu viditelnosti. public veřejně přístupné protected přístupné pouze z metod dané třídy a tříd odvozených private přístupné pouze z metod dané třídy Do proměnných jde přiřazovat, i když nebyly deklarovány. Automaticky mají viditelnost public. class Foo { private $bar; $foo = new Foo(); $foo->bar = 1; $foo->barbar = 42; // Chyba! bar je private. // Ok. Nastavi se nova polozka. verze 1.1 2008-2009, Martin Kruliš 4

Metody Metody mohou mít definovaný typ viditelnosti. Stejné typy jako u proměnných. Pokud není typ uveden, použije se implicitně public. Uvnitř metody je hostující objekt přístupný přes $this. $this se musí používat pro přístup k položkám objektu. Jinak není možné rozlišit mezi členskými a lokálními proměnnými. U metod nefunguje klasický overloading. Nelze definovat víc metod se stejným jménem. Ale je možné používat stejné techniky jako u funkcí. Implicitní hodnoty, lib. počet argumentů, Příklad 1 verze 1.1 2008-2009, Martin Kruliš 5

Dědičnost Třídy je možné odvozovat (dědit) od jiných tříd. Dědit lze jen od jedné třídy (neexistuje vícenásobná dědičnost). Vícenásobnou dědičnost lze nahradit interfaces (viz dále). Děděné metody mohou být předefinovány. Metody označené klíčovým slovem final předefinovat nejdou. Všechny metody se chovají jako virtuální. Důsledek absence typovaných proměnných v PHP. Metodu předka lze volat přes konstrukci parent::metoda(). Případně volat konkrétního předka ParentClass::metoda(). class MyFoo extends Foo { public function Bar() { parent::bar();...... Příklad 2 verze 1.1 2008-2009, Martin Kruliš 6

Konstruktor Speciální metoda construct(). Volá se automaticky při vytváření objektu (operátor new). Používá se pro inicializaci objektů. Může mít také parametry. Ale nelze jej přetěžovat (chová se stejně jako běžná metoda). Konstruktor nemusí být definován. Použije se konstruktor předka, nebo implicitní (prázdný) konstruktor. Pokud je definován, konstruktor předka se implicitně nevolá. Ale můžeme jej zavolat explicitně (viz dědičnost). Konstruktor by měl být veřejný. Pokud je privátní, instance dané třídy je možné vytvářet pouze ze členských metod. Typicky se pak používají statické metody pro vytváření objektů. verze 1.1 2008-2009, Martin Kruliš 7

Destruktor Speciální metoda destruct(). Volá se, když zaniknou všechny reference na daný objekt. Na konci skriptu se automaticky ničí všechny objekty. Nemusí být definován. Automaticky se použije destruktor otce, nebo implicitní (prázdný destruktor). Destruktor nesmí házet výjimky. Při likvidaci objektů na konci skriptu by výjimku neměl kdo chytit. Pokud je definován, destruktor předka se implicitně nevolá. Ale můžeme jej zavolat explicitně (viz dědičnost). Destruktor by měl být veřejný. Příklad 3 Pokud veřejný není, je potřeba zajistit, aby se vždy poslední reference na objekt zničila ve členské metodě. Navíc musí být všechny takové objekty zničeny před koncem skriptu. verze 1.1 2008-2009, Martin Kruliš 8

Konstanty tříd Třídy mohou mít konstanty. Uvnitř třídy se deklarují konstrukcí const name = value; Nedefinují viditelnost (automaticky jsou public). Přistupuje se k nim přes název třídy a operátor :: Uvnitř třídy lze použít místo názvu hodnotu self. class Foo { const bar = 42; function echobar() { echo self::bar; echo Foo::bar; verze 1.1 2008-2009, Martin Kruliš 9

Statické proměnné a metody Statické položky tříd Deklarují se klíčovým slovem static před proměnnou/metodou. Přistupuje se k nim přes operátor :: (obdobně jako ke konst.). Např. MyClass::$statVar nebo MyClass::myFunc() Mají typ viditelnosti stejně jako nestatické položky. Pozor na dědičnost. Re-deklarace způsobí vytvoření nové proměnné. Statické proměnné existují pouze v 1 instanci pro danou třídu. Bez ohledu na počet objektů. Statické metody se volají na třídě (ne na objektu). Uvnitř nemají k dispozici $this a pracují jen se statickými daty. Klasické metody lze také volat staticky (pokud nepoužívají $this). PHP může generovat warning. Je lepší nepoužívat. Příklad 4 verze 1.1 2008-2009, Martin Kruliš 10

Malá záludnost class A { function foo() { echo (isset($this))? 'dynamic' : 'static'; class B { function bar() { A::foo(); // staticke volani A::foo(); // vypise 'static' $obj = new B; $obj->bar(); // vypise 'dynamic' verze 1.1 2008-2009, Martin Kruliš 11

Abstraktní třídy a metody Abstraktní třídy a metody. Deklarují se klíčovým slovem abstract. Abstraktní třídy. Nelze vytvářet jejich instance. Abstraktní metody. Nemají tělo. Očekává se, že tělo bude definováno v odvozené třídě. Třída s alespoň jednou abstraktní metodou musí být také abstraktní. abstract class AbstractClass { abstract function foo(); class ConcreteClass extends AbstractClass { function foo() { foo body $obj = new ConcreteClass(); verze 1.1 2008-2009, Martin Kruliš 12

Interfaces Rozhraní (Interface) Seznam veřejných metod, které musí třída implementovat. Třída může implementovat víc rozhraní, pokud nekolidují názvy metod. interface IFoo { public function bar($goo); class Foo implements IFoo { public function bar($goo) {... verze 1.1 2008-2009, Martin Kruliš 13

Iterace objektů Objekty se dají procházet podobně jako pole. Např. konstrukcí foreach. Klíčem je řetězec s název položky. Iteruje se přes všechny viditelné položky. Lze předefinovat způsob iterace implementováním interface Iterator. class MyClass { public $var1 = 1; public $var2 = 2; private $var3 = 3; $obj = new MyClass(); foreach ($obj as $key => $value) {... Příklad 5 verze 1.1 2008-2009, Martin Kruliš 14

Kopírování (klonování) objektů Objekty se předávají referencí. Přiřazení nekopíruje objekt, ale referenci. Kopírování objektu je nutné vyvolat explicitně klonováním. $foo = new Foo(); $foo2 = clone $foo; Klonování provede "mělkou" kopii objektu. Každá položka se zkopíruje operátorem přiřazení. Operace, které se mají provést po klonování lze zapsat do speciální metody clone(). Uvnitř je k dispozici kopie objektu v proměnné $this. public function clone() { $this->innerobj = clone $this->innerobj; Příklad 6 verze 1.1 2008-2009, Martin Kruliš 15

Přetěžování přístupu k proměnným Přístup k nedefinovaným proměnným lze kontrolovat. Existují speciální privátní metody, které lze přetížit. set() nastavení hodnoty členské proměnné get() získání hodnoty členské proměnné isset() přetížení funkce isset() pro členské proměnné unset() přetížení funkce unset() pro členské proměnné Kontroluje se přístup pouze k členským proměnným, které nejsou viditelné. Buď nejsou deklarovány, nebo jsou privátní. K deklarovaným proměnným se přistupuje přímo. verze 1.1 2008-2009, Martin Kruliš 16

Přetěžování metod Obdobně jako u proměnných lze ošetřit přístup k nedefinovaným metodám. Přístup je ošetřen privátní metodou call(). Metodu je možné předefinovat a ošetřit tak volání metod, které nejsou definovány, nebo nejsou z volaného místa vidět. Pokud je taková metoda zavolána, předá se řízení přímo do call(), která dostane název volané metody a předané argumenty. Příklad 7 verze 1.1 2008-2009, Martin Kruliš 17

Další vlastnosti objektů Existují další speciální metody, které lze předefinovat: sleep() metoda je volná při serializaci (uložení na disk) wakeup() metoda volaná při deserializaci (načtení z disku) tostring() metoda definující chování při přetypování objektu na řetězec Chování porovnávacích operátorů. ($o1 == $o2) má hodnotu true, pokud jsou oba objekty stejné třídy a všechny jejich položky se rovnají. ($o1 === $o2) má hodnotu true, pokud jsou obě proměnné obsahují referenci na jeden objekt. Operátory!= a!== se chovají jako přesné negace svých protějšků. verze 1.1 2008-2009, Martin Kruliš 18

Type Hinting Typová kontrola v PHP (Type Hinting) Od PHP verze 5.1 Před parametry funkcí (a metod) je možné uvádět typ a vynutit si tak předání hodnoty konkrétního typu. Typují se pouze objekty a pole. Je-li před parametrem název třídy, musí být jeho hodnota objekt dané (nebo odvozené) třídy, nebo mít hodnotu null. Obdobně klíčové slovo array vynutí, že hodnota parametru bude pole (ovšem s libovolným obsahem). Jiné typy nejsou podporovány. Nedodržení typu při volání má za následek PHP fatal error. function foo(myclass $obj, array $params) {... verze 1.1 2008-2009, Martin Kruliš 19

Zjišťování typu objektu Operátor instanceof Ověřuje, zda je objekt instancí dané třídy, nebo třídy odvozené. Také umí ověřit, zda daný objekt implementuje nějaký interface. if ($foo instanceof FooClass)... Další související funkce pro testování typů: get_class() vrací název třídy daného objektu jako řetězec get_parent_class() vrací název rodičovské třídy is_a() zjišťuje, zda je objekt dané třídy is_subclass_of() zjišťuje, zda je objekt potomkem dané třídy Funkce is_a() a is_subclass_of() jsou zastaralé nahrazuje je operátor instanceof. verze 1.1 2008-2009, Martin Kruliš 20

Funkce pro práci s třídami a objekty Další funkce pro práci s třídami a objekty Zjišťování existence class_exists() zjišťuje, zda daná třída existuje interface_exists() zjišťuje, zda byl interface definován method_exists() ověří, zda má objekt určitou metodu Hromadné výpisy get_declared_classes() vrací pole definovaných tříd get_declared_interfaces() vrací definovaná rozhraní get_class_methods() vrací seznam metod třídy get_object_vars() vrací pole členských proměnných objektu get_class_vars() vrací pole deklarovaných proměnných třídy Nepřímé volání metod call_user_func_array(array($obj, 'methodname'), $params); Příklad 8 verze 1.1 2008-2009, Martin Kruliš 21

Použití objektů a tříd v PHP Třídy a objekty zapouzdřují logické části aplikace. Lepší sémantika, přehlednost, bezpečnost, Snazší spolupráce více lidí na jednom projektu. Rychlejší předávání dat (objekty se předávají referencí). I když to např. pole také s použitím copy-on-write. Používání návrhových vzorů. Osvědčené metody programování známé z jiných jazyků. Singleton, Factory, Adapter, Front-Controller, Model-View-Control, Nevýhody OOP. Většinou delší kód. O trochu pomalejší zpracování. verze 1.1 2008-2009, Martin Kruliš 22