You are on page 1of 53

PHP programowanie obiektowe

Wprowadzenie do OOP w PHP


2013-01-21

Uazz.pl

Uazz.pl

Strona 2

Zawarto
PHP programowanie obiektowe ............................................................................. 1 PHP programowanie obiektowe ............................................................................. 4 Obiekty............................................................................................................................... 5 Atrybuty obiektu .......................................................................................................... 7 Metody................................................................................................................................ 9 Modyfikatory dostpu ............................................................................................. 11 Metoda przeciania ................................................................................................ 14 Konstruktor ................................................................................................................... 16 Stae w klasie ............................................................................................................... 19 Sowo kluczowe instanceof ................................................................................. 20 Metoda __toString() ................................................................................................ 22 Dziedziczenie ............................................................................................................... 24 Klasy abstrakcyjne i metody .............................................................................. 28 Interfejsy ....................................................................................................................... 31 Polimorfizm ................................................................................................................... 36 Programowanie obiektowe II ................................................................................ 38 Sowa kluczowe static ............................................................................................ 38 Sowo kluczowe final ............................................................................................... 40 Deep copy vs shallow copy .................................................................................. 42 Wyjtki............................................................................................................................. 47 Konstruktor przecienia ..................................................................................... 50

Uazz.pl

Strona 3

PHP programowanie obiektowe


W tej czci kursu PHP bdziemy mwi o obiektowym programowaniu w PHP. Istniej trzy powszechnie stosowane paradygmaty programowania. Programowanie proceduralne, programowanie funkcjonalne i programowanie obiektowe. PHP 5 obsuguje zarwno proceduralne, jak i obiektowe programowanie. We wczeniejszych wersjach PHP mia ograniczone wsparcie lub by brak wsparcia dla OOP. Programowanie obiektowe (OOP) jest paradygmatem programowania, ktry uywa obiektw i ich interakcje do projektowania aplikacji i programw komputerowych. (Wikipedia) Istniej pewne podstawowe pojcia programowania w OOP:

Abstraction (Abstrakcja) Polymorphism (Polimorfizm) Encapsulation (Hermetyzacja) Inheritance (Dziedziczenie)

Abstrakcja jest to uproszczenie zoonej rzeczywistoci przez modelowanie klas odpowiednich do problemu. Polimorfizm jest to proces, ktry uywa operatora lub funkcji w rny sposb dla rnych danych wejciowych. Hermetyzacja ukrywa szczegy dotyczce implementacji klasy z innych obiektw. Dziedziczenie jest to sposb, aby nowe klasy uyway klas, ktre ju zostay zdefiniowane.

Uazz.pl

Strona 4

Obiekty
Obiekty s podstawowym budulcem programu OOP w PHP. Obiekt jest to poczenie danych i metod. W programie OOP moemy tworzy obiekty. Obiekty te komunikuj si ze sob za pomoc metod. Kady obiekt moe odbiera wiadomoci, wysya wiadomoci i przetwarza dane. Istniej dwa kroki w tworzeniu obiektu. Po pierwsze musimy utworzy klas. Klasa jest szablonem dla obiektu. Jest to plan, ktry opisuje stan i zachowanie obiektw klasy. Klasa moe suy do tworzenia wielu obiektw. Obiekty utworzone w czasie wykonywania z klasy s nazywane instances (wystpienia) danej klasy.
<?php class Przyklad {} $object = new Przyklad(); print_r($object); echo gettype($object), "\n"; ?>

W pierwszym przykadzie tworzymy prosty obiekt.


class Przyklad {}

To jest definicja prostej klasy. Zawarto szablonu jest pusta. Nie ma adnych danych ani metody.
$object = new Przyklad();

Tworzymy now instancj klasy Przyklad. W tym celu uzywamy sowo kluczowe new. Zmienna $object jest uchwytem do utworzonego obiektu.
print_r($object); echo gettype($object), "\n";

Za pomoc funkcji print_r() uzyskujemy informacje na temat obiektu i funkcji gettype(), aby uzyska typ zmiennej.
$ php klasa.php Przyklad Object (

Uazz.pl

Strona 5

) object

Nie mamy tu wiele informacji, poniewa definicja klasy bya pusta. Typ zmiennej to object.

Uazz.pl

Strona 6

Atrybuty obiektu
Atrybuty obiektu to dane w instancji klasy. Atrybutami obiektu nazywane s zmienne instancji lub pola. Zmienn instancji jest zmienna zdefiniowana w klasie, dla ktrej kady obiekt w klasie ma osobn kopi.
<?php class Osoba { public $imie = ""; } $p1 = new Osoba(); $p1->imie = "Janek"; $p2 = new Osoba(); $p2->imie = "Beata"; echo $p1->imie . "\n"; echo $p2->imie . "\n"; ?>

W powyszym skrypcie PHP mamy klas Osoba z jednym polem (zmienn).


$p1 = new Osoba(); $p1->imie = "Janek";

Tworzymy instancj klasy Osoba. I zestaw zmiennej $imie z wartoci "Janek". Uywamy -> operatora, aby uzyska dostp do atrybutw obiektw.
$p2 = new Osoba(); $p2->imie = "Beata";

Tworzymy inne wystpienie klasy Osoba. Tu moemy sobie ustawi zmienn "Beata".
echo $p1->imie . "\n"; echo $p2->imie . "\n";

Moemy wywietli zawarto zmiennych na konsoli.


$ php osoba.php Janek Beata

Uazz.pl

Strona 7

Widzimy, dane wyjciowe skryptu. Kade wystpienie klasy Osoba ma osobn kopi zmiennej $imie.

Uazz.pl

Strona 8

Metody
Metody s zdefiniowane w ciele klasy. Su one do wykonywania operacji z atrybutami naszych obiektw. Metody s istotne w koncepcji enkapsulacji (hermetyzacji) paradygmatu OOP. Na przykad moemy mie metod connect() w naszej klasie AccessDatabase. Nie musimy by informowani, jak dokadnie metoda connect() czy si z baz danych. Wiemy tylko, e jest uywana do czenia si z baz danych. Jest to istotne w podziale obowizkw w programowaniu. Zwaszcza w duych aplikacjach.
<?php class Kolo { public $promien; function setRadius($promien) { $this->promien = $promien; } function powierzchnia() { return $this->promien * $this->promien * M_PI; } } $c = new Kolo(); $c->setRadius(5); echo $c->powierzchnia(), "\n"; ?>

W przykadzie powyej mamy klas Kolo. Moemy zdefiniowa dwie metody.


public $promien;

Mamy jedn zmienn (pole). Jest to promie okrgu. Sowo kluczowe public jest specyfikatorem dostpu. Mwi, e zmienna jest w peni dostpna z zewntrz.
function setRadius($promien) { $this->promien = $promien; }

Jest to metoda setRadius(). Jest to normalna funkcja PHP. Tak nazywamy funkcje zdefiniowane wewntrz metody klasy. Zmienna $this jest to specjalna zmienna, ktrej uywamy, aby odwoa si do zmiennej. Uazz.pl Strona 9

function area() { return $this->promien * $this->promien * M_PI; }

Metoda powierzchnia() zwraca powierzchni koa. M_PI jest to staa wbudowana w jzyku PHP.
$ php kolo.php 78.5398163397

Uruchomiony przykad.

Uazz.pl

Strona 10

Modyfikatory dostpu
Modyfikatory dostpu ustawiaj widoczno pl i metod. PHP 5 ma trzy rodzaje modyfikatorw dostpu. Public (publiczny), private( prywatne) i protected (chronione). Do public (publicznych) modyfikatorw mona uzyska dostp z dowolnego miejsca. Elementy protected mog by dostpne tylko w obrbie samej klasy i w klasach dziedziczonych i klasach rodzicw. Elementy private (prywatne) mog by dostpne tylko w klasie, ktra definiuje element prywatny. Modyfikatory dostpu su do ochrony danych przed przypadkowymi zmianami. Czyni to programy bardziej odporne na bdy.
<?php class Osoba { public $imie = ""; private $wiek; } $p = new Osoba(); $p->imie = "Janek"; #$p->wiek = 17; echo $p->imie . "\n"; ?>

W powyszy skrypcie PHP mamy dwie zmienne (pola). Jedna jest zadeklarowana jako public (publiczna), a druga jako private (prywatna).
$p->imie = "Jane"; #$p->wiek = 17;

Mamy dostp do zmiennej $imie z zewntrz klasy. Przez zewntrzny dostp mamy na myli "nie w klasie". Wszystko jest OK, dopki zmienna $imie jest zadeklarowana jako publiczna (public). Dostp do zmiennej $wiek nie jest moliwy. Prywatny (private) modyfikator zabrania tego. Jeli odkomentujemy lini kodu, bdzie wywietlony komunikat 'Fatal error: Cannot access private property Person::$age' error. "bd krytyczny: nie ma dostpu do waciwoci prywatnej Osoba:: $wiek' bd.

Uazz.pl

Strona 11

<?php class Baza { public $imie = "Baza"; protected $id = 6344; private $is_defined = "tak"; } class Rozszerzona extends Baza { public function info() { echo "To jest klasa Rozszerzona\n"; echo "Klasa dziedziczy: \n"; echo $this->imie . "\n"; echo $this->id . "\n"; echo $this->is_defined . "\n"; } } $informacja = new Rozszerzona(); $informacja->info(); ?>

W tym skrypcie PHP mamy pochodne klasy, ktra rozszerza klas bazow. Klasa bazowa ma trzy pola. Wszystkie z innym modyfikatorem dostpu. Pole $is_defined nie jest dziedziczone. Prywatny (private) modyfikator zapobiega temu.
public function info() {

Metoda info() ma publiczny (public) modyfikator dostpu. Oznacza to, moe ona zosta wywoana poza rodowiskiem klasy.
$ php dostep.php To jest klasa Rozszerzona Klasa dziedziczy: Baza 6344

Uruchomiajc skrypt PHP, moemy otrzyma nastpujce wyniki. Pola publiczne i chronione s dziedziczone, prywatne pole nie jest.

Uazz.pl

Strona 12

<?php class SysInfo { private function get_date() { return date("Y/m/d"); } private function get_version() { return phpversion(); } public function getInfo() { $date = $this->get_date(); $wersja = $this->get_version(); echo "Data: $date\n"; echo "Wersja PHP to: $wersja\n"; } } $sys = new SysInfo(); $sys->getInfo(); #$sys->get_date(); ?>

W tym skrypcie PHP mamy klas SysInfo. Wynikiem dziaania s informacje o systemie wywietlane w konsoli. Mamy dwie funkcje prywatne i jedn publiczn. Metody prywatne s tu tylko uywane wewntrz klasy SysInfo. Nie s one przeznaczone do uywania poza klas.
$sys = new SysInfo(); $sys->getInfo(); #$sys->get_date();

Tworzymy instancj klasy SysInfo i wywoujemy dostpn metod publiczn getInfo(). Metoda getInfo() uywa wewntrznie prywatnych metod do jej pracy. Odkomentowanie ostatniego wiersza kodu daje bd.

Uazz.pl

Strona 13

Metoda przeciania
Metoda przecienia pozwala na tworzenie kilku metod o tej samej nazwie, ktre rni si od siebie typem danych wejciowych. Czy przecianie metody jest dobre? Biblioteka Qt4 daje dobry przykad dla uytkownika. Klasa QPainter ma trzy metody, aby narysowa prostokt. Ich nazwa to drawRect(), a ich parametry rni si. Jedna z nich ma odniesienie do obiektu prostokt typu float, inna ma odniesienie do obiektu rectangle typu int i ostatnia ma cztery parametry, x, y, szeroko, wysoko. Jeli jzyk C++ jest jzykiem, w ktrym Qt jest rozwijany, nie ma metod przeciania, twrcy biblioteki bd musieli utworzy metody, takie jak drawRectRectF(), drawRectRect(), drawRectXYWH(). Rozwizanie z przecieniem metody jest bardziej eleganckie.
<?php class Suma { public function getSum() { return 0; } public function getSum($x) { return $x; } public function getSum($x, $y) { return $x + $y; } } $s = echo echo echo ?> new Suma(); $s->getSum() . "\n" ; $s->getSum(5) . "\n" ; $s->getSum(3, 4) . "\n" ;

Jest to metoda przeciania, znamy to z jzykw, takich jak C#, Java lub C++. Ale to nie dziaa w PHP. Po uruchomieniu tego przykadu, otrzymujemy nastpujcy komunikat o bdzie: 'Fatal error: Cannot redeclare Sum::getSum()' "bd krytyczny: nie mona zadeklarowa Suma::getSum()'. Funkcje PHP mog przyjmowa dowoln liczb zmiennych domylnie. Do symulacji, metody przecienia w PHP, moemy uy funkcji func_get_args(). Uazz.pl Strona 14

<?php class Suma { public function getSum() { $args = func_get_args(); if (empty($args)) return 0; foreach ($args as $arg) { $sum += $arg; } return $sum; } } $s = echo echo echo echo ?> new Suma(); $s->getSum() . "<br />" ; $s->getSum(5) . "<br />" ; $s->getSum(3, 4) . "<br />" ; $s->getSum(3, 4, 7) . "<br />" ;

Tym razem, skrypt zostanie uruchomiony.


$args = func_get_args();

Funkcja func_get_args() zwraca tablic, obejmujc list argumentw funkcji.


foreach ($args as $arg) { $sum += $arg; }

Przechodzimy przez wszystkie elementy tablicy, a nastpnie obliczamy sum.


echo echo echo echo $s->getSum() . "\n" ; $s->getSum(5) . "\n" ; $s->getSum(3, 4) . "\n" ; $s->getSum(3, 4, 7) . "\n" ;

Wywoujemy tak sam nazw metody z rn liczb wej.

Uazz.pl

Strona 15

Konstruktor
Konstruktor jest specjalnym rodzajem metody. Jest ona automatycznie wywoywana, gdy tworzony jest obiekt. Celem konstruktora jest inicjowanie stanu obiektu. Nazwa konstruktora w PHP 5 jest zawsze __construct(). (podwjne podkrelenie)
<?php class Piosenka { function __construct() { echo "Obiekt Piosenka zosta utworzony \n"; } } $piosenka = new Piosenka(); ?>

Mamy klas Piosenka. Ta klasa posiada konstruktor, ktry wywietla wiadomo na konsoli.
$piosenka = new Piosenka();

Jest to czas, kiedy obiekt jest tworzony i konstruktor jest wywoywany. Dostajemy wiadomo na konsoli.
$ php konstruktor.php Obiekt Piosenka zosta utworzony

Jest to wynik dziaania skryptu. Konstruktory czsto uywaj argumentw.


<?php class Piosenka { function __construct($piosenka) { echo "Piosenka $piosenka jest utworzona \n"; } }

Uazz.pl

Strona 16

$piosenka = new Piosenka("Malinowy krl"); ?>

Moemy zmieni nieco poprzedni przykad. Moemy przekaza warto do konstruktora.


function __construct($piosenka) { echo "Piosenka $piosenka jest utworzona \n"; }

Przekazany argument jest przechowywany w zmiennej lokalnej $piosenka.


$ php konstruktor2.php Piosenka Malinowy krl jest utworzona

Teraz mamy wywietlony tytuu piosenki w konsoli. W nastpnym przykadzie moemy zainicjowa pola klasy. Inicjacja zmiennych jest typowym zadaniem dla konstruktorw.
<?php class Przyjaciel { private $urodzony; private $imie; function __construct($imie, $urodzony) { $this->imie = $imie; $this->urodzony = $urodzony; } function getInfo() { echo "Mj przyjaciel $this->imie urodzi si w $this->urodzony\n"; } } $przyjaciel = new Przyjaciel("Adam", 1976); $przyjaciel->getInfo(); ?>

Mamy klas Przyjaciel z polami i metodami.


private $urodzony; private $imie;

Uazz.pl

Strona 17

Mamy dwie zmienne w definicji klasy. Sowo kluczowe private jest modyfikatorem dostpu. Jest to forma hermetyzacji. Sowo kluczowe private jest najbardziej restrykcyjnym modyfikatorem. Pozwala na dostp tylko obiektowi, w ktrym wystpuje. Wicej na ten temat pniej.
function __construct($imie, $urodzony) { $this->imie = $imie; $this->urodzony = $urodzony; }

W konstruktorze inicjujemy dwa pola. Zmienna $this jest uywana do dostpu do zmiennych obiektu.
$przyjaciel = new Przyjaciel("Adam", 1976); $przyjaciel->getInfo();

Tworzymy obiekt Przyjaciel z dwoma argumentami. Nastpnie moemy wywoa metod getInfo() obiektu. Do wywoania metody obiektu, moemy uy operatora >.
$ php przyjaciel.php Mj przyjaciel Adam urodzi si w 1976

Uazz.pl

Strona 18

Stae w klasie
PHP umoliwia tworzenie staych klasy. Te stae nie nale do konkretnego obiektu. Nale one do tej klasy. Umownie stae s pisane wielkimi literami.
<?php class Math { const PI = 3.14159265359; public function getPI() { echo self::PI; } } $math = new Math(); echo Math::PI, "\n"; echo $math->getPI(), "\n"; ?>

Mamy klasy Math ze sta PI.


const PI = 3.14159265359;

Sowo kluczowe const jest uywane do definiowania staych.


public function getPI() { echo self::PI; }

Stae w klasie s dostpne w ramach metody za pomoc sowa kluczowego self, a nastpnie przez dwa dwukropki.
echo Math::PI, "\n"; echo $math->getPI(), "\n";

Wywietlamy sta PI na konsoli. W pierwszym przypadku mamy sta warto odwoujc si do nazwy klasy, a nastpnie dwa dwukropki i nazw staej. Naley zauway, e obiekt nie by potrzebny, aby uzyska dostp do staej. W drugim przypadku uywamy metody obiektu.

Uazz.pl

Strona 19

Sowo kluczowe instanceof


Sowo kluczowe instanceof jest uywane do okrelenia czy dany obiekt jest obiektem danej klasy, lub klasy, ktra dziedziczy po danej klasie, oraz czy zmienna PHP jest instancj obiektu pewnej klasy.
<?php class Kot {} class Pies {} class Ptak {} $objekt = array(new Kot(), new Pies(), new Kot(), new Ptak(), new Ptak(), new Pies(), new Pies(), new Kot(), new Ptak() ); shuffle($objekt); foreach ($objekt as $object) { if ($object instanceof Kot) { echo "To jest Kot <br />"; } elseif ($object instanceof Pies) { echo "To jest Pies <br />"; } elseif ($object instanceof Ptak) { echo "To jest Ptak <br />"; } } ?>

W skrypcie powyej mamy trzy klasy. Kot, Pies i Ptak. Przechodzimy przez tablic i wywietlamy nazwy klas dla kadej wartoci tablicy.
$objekt = array(new Kot(), new Pies(), new Kot(), new Ptak(), new Ptak(), new Pies(), new Pies(), new Kot(), new Ptak() );

Tworzymy tablic tych obiektw.


shuffle($objekt);

Uazz.pl

Strona 20

Funkcja shuffle losuje kolejno elementw w tablicy. W tym momencie nie wiemy, jakie klasy s zapisane w tablicy.
if ($object instanceof Kot) { echo "To jest Kot <br />"; }

Tutaj moemy uy sowa kluczowego instanceof aby dowiedzie si, jaki jest typ klasy.
$ php instanceof.php To jest Ptak To jest Kot To jest Kot To jest Pies To jest Pies To jest Kot To jest Pies To jest Ptak To jest Ptak

Dane wyjciowe uruchomionego skryptu.

Uazz.pl

Strona 21

Metoda __toString()
Gdy uywamy sowa kluczowego print lub echo wystpujcego z instancj obiektu, to wywoywana jest specjalna metoda __toString(). Pokaemy to w poniszym przykadzie.
<?php class Kot { public $imie; public $wiek; function __construct($imie, $wiek) { $this->wiek = $wiek; $this->imie = $imie; } function __toString() { return "Kot: $this->imie, Wiek: $this->wiek \n"; } } $pimpek = new Kot("Pimpek", 6); $tofik = new Kot("Tofik", 4); print $pimpek; echo $tofik; ?>

Mamy klas Kot z zdefiniowan specjaln metod __toString().


function __toString() { return "Kot: $this->imie, Wiek: $this->wiek \n"; }

Metoda wywietla podstawowe informacje o obiekcie.


$pimpek = new Kot("Pimpek", 6); $tofik = new Kot("Tofik", 4);

Uazz.pl

Strona 22

Tworzymy dwa obiekty klasy Kot.


print $pimpek; echo $tofik;

I uywamy sw kluczowych print lub echo.


$ php tostring.php

Kot: Pimpek, Wiek: 6 Kot: Tofik, Wiek: 4 Powyej wynik dziaania skryptu.

Uazz.pl

Strona 23

Dziedziczenie
Dziedziczenie jest to sposb, aby nowe klasy byy tworzone przy uyciu klas, ktre ju zostay zdefiniowane. Nowo powstae klasy s nazywane klasami pochodnymi, tak nazywane s klasy, ktre tworzymy na podstawie klasy bazowej. Wane, jest, e korzyci wynikajce z dziedziczenia to wielokrotne wykorzystanie kodu i zmniejszenie zoonoci programu. Klasy pochodne (potomkowie) mog zastpi lub rozszerzy funkcjonalno klasy bazowej (przodkw).
<?php class Podstawowa { function __construct() { echo " Konstrukcja klasy podstawowej \n"; } } class Pochodna extends Podstawowa { function __construct() { parent::__construct(); echo " Konstrukcja klasy pochodnej \n"; } } $obj1 = new Podstawowa(); $obj2 = new Pochodna(); ?>

W tym skrypcie PHP mamy dwie klasy. I klas pochodn i klas podstawow. Klasa Pochodna dziedziczy z klasy Podstawowa.
class Pochodna extends Podstawowa {

W PHP, uywamy sowa kluczowego extends do tworzenia relacji dziedziczenia.


function __construct() { parent::__construct(); echo " Konstrukcja klasy pochodnej \n"; }

W konstruktorze klasy Pochodna wywoujemy konstruktora rodzica. Uywamy sowa parent, a nastpnie dwa dwukropki i metod __construct(). Konstruktor klasy bazowej musi by jawnie wywoany. Uazz.pl Strona 24

$obj1 = new Podstawowa(); $obj2 = new Pochodna();

Moemy utworzy bazy podstawowe i klasy pochodne.


$ php klasy.php

Konstrukcja klasy podstawowej Konstrukcja klasy podstawowej Konstrukcja klasy pochodnej To dane wyjciowe skryptu PHP. Przykad bardziej skomplikowanego skryptu.

<?php abstract class Istota { protected $jestZywy = true; public function jestZywy() { if ($this->jestZywy) { echo "Istota jest ywa\n"; } else { echo "Istota jest nie ywa\n"; } } public function kill() { $this->jestZywy = false; } } abstract class Zwierze extends Istota { protected $wiek; public function __construct($wiek) { $this->wiek = $wiek; } protected function setAge($wiek) { $this->wiek = $wiek; } public function getAge() { return $this->wiek; }

Uazz.pl

Strona 25

} class Kot extends Zwierze { private $imie; public function __construct($imie, $wiek) { $this->ime = $imie; parent::__construct($wiek); } public function getName() { return $this->imie; } } $kot = new Kot("Tofik", 4); $kot->jestZywy(); echo $kot->getName() . " ma " . $kot->kill(); $kot->jestZywy(); ?>

$kot->getAge() . " lat(a)\n";

Uylimy tutaj kilka nowych koncepcji. W przykadowym kodzie mamy trzy klasy. Istota, Zwierze i Kot. Klasa Zwierze dziedziczy z klasy Istota. Klasa Kot dziedziczy z klasy Zwierze. Klasy dziedzicz metody i elementy danych, ktre nie zostay zadeklarowane, jako prywatne.
abstract class Istota {

Klasa Istota jest zadeklarowana za pomoc sowa abstract. Sowo kluczowe abstract zakazuje wystpienia klasy. Nie ma sensu aby utworzy wystpienie klasy Istota.
protected $jestZywy = true;

Waciwo (zmienna, pole) $jestZywy jest zadeklarowana za pomoc sowa protected. Waciwoci s dostpne tylko dla klas, w ktrych zostay zadeklarowane oraz w klasach potomnych.
abstract class Zwierze extends Istota {

Klasa Animal jest rwnie uznana za abstrakcyjn. Dziedziczy z klasy Istota. W tym celu moemy uy sowa kluczowego extends. Klasa Zwierze jest potomkiem. Dziedziczy metody i zmienne klasy bazowej Istota.
class Kot extends Zwierze {

Uazz.pl

Strona 26

Klasa Kot dziedziczy z klasy Zwierze. Dziedziczy z klasy Zwierze i porednio z klasy Istota. Ta klasa nie jest zadeklarowana, jako abstrakcyjna, co oznacza, moemy uywa jej instancj.
parent::__construct($wiek);

W konstruktorze klasy Kot, wywoujemy konstruktor rodzica przy uyciu sowa parent, nastpnie przez dwa dwukropki i metod __ construct (). Konstruktor klasy dominujcej musi by wywoany jawnie.
$kot = new Kot("Tofik", 4); $kot->jestZywy(); echo $kot->getName() . " ma " . $kot->kill(); $kot->jestZywy();

$kot->getAge() . " lat(a)\n";

Tworzymy nowy obiekt Kot. Tofik, 4 lat. Nastpnie wywoujemy funkcje na obiekcie Tofik. Naley zwrci uwag na wykorzystanie metod, ktre nie zostay utworzone w klasie Kot, ale dziedziczone z klas nadrzdnych.
$ php dziedziczenie.php Istota jest ywa ma 4 lat(a) Istota jest nie ywa

Dane wyjciowe skryptu.

Uazz.pl

Strona 27

Klasy abstrakcyjne i metody


PHP 5 wprowadza klasy i metody abstrakcyjne. Nie mona utworzy wystpienia klasy abstrakcyjnej. Jeli Klasa zawiera, co najmniej jedn metoda abstrakcyjna, musi by zadeklarowana take, jako abstrakcyjna. Metody abstrakcyjne nie mog by implementowane. Kiedy moemy dziedziczy z klasy abstrakcyjnej, wszystkie metody abstrakcyjne musz by zaimplementowane w klasie pochodnej. Ponadto metody te musz by zadeklarowane z t sam ograniczon widocznoci. Unlike interfaces, abstract classes may have methods with full implementation and may also have defined member fields. So abstract classes may provide a partial implementation. Programmers often put some common functionality into abstract classes. And these abstract classes are later subclassed to provide more specific implementation. For example, the Qt graphics library has a QAbstractButton, which is the abstract base class of button widgets, providing functionality common to buttons. Buttons Q3Button, QCheckBox, QPushButton, QRadioButton, and QToolButton inherit from this base abstract class. W przeciwiestwie do interfejsw (interfaces) klasy abstrakcyjne mog mie metody z pen implementacj i mog rwnie mie zdefiniowane waciwoci (zmienne). Wic klasy abstrakcyjne mog zapewni czciow implementacje. Programici czsto umieszczaj niektre typowe funkcje w klasach abstrakcyjnych. Klasy abstrakcyjne zapewniaj podklasom okrelone implementacje. Na przykad biblioteka graficzna Qt ma QAbstractButton, ktra jest abstrakcyjn klas z podstawowymi wzorami przyciskw, zapewniajc funkcje wsplne dla przyciskw. Przyciski Q3Button, QCheckBox, QPushButton, QRadioButton i QToolButton dziedzicz z tej podstawowej klasy abstrakcyjnej. Formalnie mwic, abstrakcyjne klasy s uywane do wymuszania protokou. Protok to zestaw czynnoci, ktre musz obsugiwa wszystkie obiekty wykonawcze.
<?php abstract class Rysunek { protected $x = 0; protected $y = 0; public abstract function obszar(); public function getCoordinates() {

Uazz.pl

Strona 28

echo "\$x is $this->x\n"; echo "\$y is $this->y\n"; } } class Kolo extends Rysunek { private $promien; public function __construct($x, $y, $r) { $this->promien = $r; $this->x = $x; $this->y = $y; } public function obszar() { return $this->promien * $this->promien * pi(); } public function __toString() { return " Koo, w x: $this->x, y: $this->y, promie: $this->promien"; } } $o = echo echo echo ?> new Kolo(12, 45, 22); "$o \n"; " Obszar koa: " . $o->obszar() . "\n"; $o->getCoordinates();

W naszym skryptcie PHP mamy abstrakcyjn klas podstawow Rysunek. Klasa definiuje dwa pola (waciwoci, zmienne), definiuje jedn metod i deklaruje, jedn metod. Jedna z metod jest abstrakcyjna, druga jest w peni implementowana. Klasa Rysunek jest abstrakcyjna, poniewa nie moemy rysowa. Mamy narysowa okrg, kropk lub kwadrat. Klasa Rysunek ma pewne typowe funkcje dla obiektw, ktre mona wycign.
class Kolo extends Rysunek {

Klasa Kolo jest podklas klasy Rysunek. Ona musi implementowa abstrakcyjne metody.
$ php abstrakt.php Koo, w x: 12, y: 45, promie: 22 Obszar koa: 1520.5308443375 $x is 12 $y is 45

Uazz.pl

Strona 29

Dane wyjciowe skryptu.

Uazz.pl

Strona 30

Interfejsy
Pilot zdalnego sterowania jest interfejsem pomidzy widzem i telewizorem. Jest to interfejs do elektronicznych urzdze. Protok dyplomatyczny prowadzi wszystkie dziaania w dyplomacji. Przepisy ruchu drogowego s to reguy, ktre musz przestrzega kierowcy, rowerzyci i piesi. Interfejsy programowania s analogiczne w poprzednich przykadach. Interfaces are: Interfejsy s:

APIs Contracts

Obiekty wchodz w interakcje ze wiatem zewntrznym za pomoc metod. Faktyczna implementacja nie jest wana dla programisty, lub te moe by to dla niego tajne. Firma moe sprzedawa biblioteki i nie chce ujawnia rzeczywistych realizacji. Programista moe wywoa metod maximize() okna narzdzi GUI, ale nie wie nic na temat jak ta metoda jest implementowana. Z tego punktu widzenia interfejsy s to metody, za pomoc, ktrych obiekty wchodz w interakcj ze wiatem zewntrznym, nie naraajc zbytnio ich wewntrzne funkcjonowanie. Z drugiego punktu widzenia interfejsy s jedynie zbiorem cile okrelonych regu.. Jeeli s one uzgodnione, musz one by stosowane. S one uywane do projektowania architektury aplikacji. One pomagaj w zorganizowaniu kodu. Interfejsy s to cakowicie abstrakcyjne typy. One s deklarowane przy uyciu sowa kluczowego interface. Interfejsy moe mie tylko zadeklarowane metody. Wszystkie metody zadeklarowane w interfejsie musz by publiczne. One nie moj penej implementacji metody, ani pola (zmienne). Klasy PHP mog implementowa dowoln liczb interfejsw. Interfejs mona rozszerza dowoln liczb interfejsw. Klasa, ktra implementuje interfejs musi implementowa wszystkie metody interfejsu. Interfejsy s uywane do symulowania wielokrotnego dziedziczenia. Klasy PHP mona rozszerzy tylko jedn klas. Klasy PHP mog zaimplementowa wiele interfejsw. W wielokrotnym dziedziczeniu przy uyciu interfejsw nie chodzi o Uazz.pl Strona 31

dziedziczenie metod i zmiennych. Chodzi o dziedziczenie pomysw lub umw, ktre s opisane przez interfejsy. Istnieje jedna istotna rnica midzy interfejsem i klas abstrakcyjn. Klasy abstrakcyjne dostarczaj czciow implementacj dla klas, ktre s zwizane w hierarchii dziedziczenia. Interfejsy z drugiej strony mog by implementowane przez klasy, ktre nie s powizane ze sob. Na przykad mamy dwa przyciski. Klasyczny przycisk i okrgy przycisk. Oba dziedzicz z klasy abstrakcyjnej przycisk, ktra zapewnia pewne typowe funkcje dla wszystkich przyciskw. Innym przykadem mog by klasy Database i SignIn. Nie s one powizane ze sob. Moemy zastosowa interfejs ILoggable, ktry mia zmusi ich do utworzenia metody do logowania.
<?php interface IInfo { public function do_inform(); } class Some implements IInfo { public function do_inform() { echo "To jest przykadowa klasa\n"; } } $sm = new Some(); $sm->do_inform(); ?>

Jest to prosty skrypt PHP, demonstrujcy interfejs.


interface IInfo { public function do_inform(); }

Jest to interfejs IInfo. Deklaracja metody do_inform().


class Some implements IInfo {

Uywamy sowa implements do implementacji interfejsu.


public function do_inform() { echo " To jest przykadowa klasa \n"; }

Uazz.pl

Strona 32

Klasa dostarcza implementacj metody do_inform(). W nastpnym przykadzie pokazano, jak klasa moe zaimplementowa wiele interfejsw.
<?php interface Device { public function switch_on(); public function switch_off(); } interface Volume { public function volume_up(); public function volume_down(); } interface Pluggable { public function plug_in(); public function plug_off(); } class CellPhone implements Device, Volume, Pluggable { public function switch_on() { echo " Wczanie \n"; } public function switch_off() { echo " Wyczanie \n"; } public function volume_up() { echo "Goniej\n"; } public function volume_down() { echo "Ciszej\n"; } public function plug_in() { echo "Podczanie\n"; } public function plug_off() { echo "Odczanie\n"; } } $o = new CellPhone(); $o->switch_on(); $o->volume_up(); $o->plug_in(); ?>

Mamy klas CellPhone, ktra dziedziczy z trzech interfejsw.


class CellPhone implements Device, Volume, Pluggable {

Klasy implementuje wszystkie trzy interfejsy, ktre s przedzielone przecinkiem. Klasa CellPhone musi implementowa wszystkie metody ze wszystkich trzech interfejsw.
$ php interfejs.php Wczanie

Uazz.pl

Strona 33

Goniej Podczanie

Uruchamianie skryptu PHP. W nastpnym przykadzie pokazano, jak rozszerzy interfejsy przez wiele innych interfejsw.
<?php interface IInfo { public function do_inform(); } interface IVersion { public function get_version(); } interface ILog extends IInfo, IVersion { public function do_log(); } class DBConnect implements ILog { public function do_inform() { echo "To jest klasa DBConnect\n"; } public function get_version() { echo "Wersja 1.02\n"; } public function do_log() { echo "Logowanie\n"; } public function connect() { echo "czenie z baz danych\n"; } } $db = new DBConnect(); $db->do_inform(); $db->get_version(); $db->do_log(); $db->connect(); ?>

W tym skrypcie PHP moemy zdefiniowa trzy interfejsy. Rozszerzenie interfejsw pozwala nam zorganizowa je. Uazz.pl Strona 34

interface ILog extends IInfo, IVersion { public function do_log(); }

Interfejs ILog rozszerza inne dwa interfejsy.


public function do_inform() { echo " To jest klasa DBConnect \n"; }

Klasa DBConnect implementuje metod do_inform(). Metoda ta zostaa odziedziczona przez interfejs ILog, ktry implementuje klas.

Uazz.pl

Strona 35

Polimorfizm
Polimorfizm jest to proces, ktry uywa operator lub funkcj w rny sposb dla rnych danych wejciowych. W praktyce polimorfizm oznacza, e jeli Klasa B dziedziczy z klasy A, nie musi dziedziczy wszystkiego z klasy A; moe zrobi kilka rzeczy z tej klasy. Oglnie rzecz biorc polimorfizm jest to zdolno do tworzenia kilku obiektw z okrelonych klas bazowych. Technicznie rzecz biorc jest to zdolno przedefiniowania metod klasy pochodnej. Polimorfizm dotyczy stosowania okrelonej implementacji interfejsu lub bardziej oglnie klasy podstawowej.
<?php abstract class Ksztalt { private $x = 0; private $y = 0; public abstract function area(); } class Prostokat extends Ksztalt { function __construct($x, $y) { $this->x = $x; $this->y = $y; } function area() { return $this->x * $this->y; } } class Kwadrat extends Ksztalt { function __construct($x) { $this->x = $x; } function area() { return $this->x * $this->x; } } $shapes new new new ); = array( Kwadrat(5), Prostokat(12, 4), Kwadrat(8)

foreach ($shapes as $shape) { echo $shape->area() . "\n";

Uazz.pl

Strona 36

} ?>

W powyszym skrypcie PHP mamy klas abstrakcyjn Ksztat. Ta klasa przemienia si w dwie klasy podrzdne, Prostokat i Kwadrat. Oba rozwizania zapewniaj realizacj metody area(). Polimorfizm przynosi elastycznoci i skalowalno systemw OOP.

Uazz.pl

Strona 37

Programowanie obiektowe II
W tym rozdziale kursu PHP nadal opisujemy OOP w jzyku PHP.

Sowa kluczowe static


Moemy zadeklarowa waciwoci klasy i metody jako static (statyczne). Statyczne waciwoci i metody nie nale do instancji klasy. Nale one do samej klasy. S one dostpne przez operator (::).
<?php class Sys { public static function println($string) { echo "$string\n"; } } Sys::println("PHP"); Sys::println("PERL"); Sys::println("Python"); Sys::println("Pike"); ?>

W powyszym skrypcie PHP mamy metod statyczn (static) println(). Wywietla cig i przechodzi do nowej linii. W tym przykadzie wywodzi si z jzyka Java.
Sys::println("PHP");

Nie potrzebujemy w obiekcie wywoywa metody println(). Wywoujemy metody statyczne (static) okrelajc nazw klasy, a nastpnie uywamy operatora podwjny dwukropek i jej nazw.
$ php static1.php PHP PERL Python Pike

Powyej dane wyjciowe skryptu.

Uazz.pl

Strona 38

<?php class Math { public static $PI = 3.14159265359; } echo Math::$PI . "\n"; ?>

I teraz mamy przykad ze zmienn statyczn.


echo Math::$PI . "\n";

Moemy uzyska dostp do zmiennej okrelajc nazw klasy, i nastpnie operator zakresu i nazw zmiennej.

Uazz.pl

Strona 39

Sowo kluczowe final


Jeeli metoda zostanie zdefiniowana z uyciem sowa kluczowego final, to nie bdzie moga zosta nadpisana w adnej podklasie. Uycie sowa kluczowego final jest kwesti projektowania aplikacji. Niektre klasy nie powinny by rozszerzane i niektre metody nie powinny by nadpisane. To zachowanie jest egzekwowane przez sowo final.

<?php class Podstawowa { final function say() { echo " Klasa podstawowa "; } } class Pochodna extends Podstawowa { function say() { echo " Klasa pochodna "; } } ?>

Ten skrypt PHP nie uruchomi si. Moemy dosta bd " Cannot override final method Base::say()".
<?php final class Math { static function getPI() { return 3.141592; } } class DerivedMath extends Math { function say() { echo "DerivedMath class"; } } ?>

Uazz.pl

Strona 40

W poprzednim skrypcie PHP mamy prototyp klasy podstawowej Math. Jedynym celem tej klasy jest zapewnienie kilka pomocnych metod i staych. (W naszym przypadku mamy tylko jedn metod). Nie jest tworzona jako rozszerzona. Aby unikn nadpisywania metod przez innych programistw, aby nie mogli dziedziczy z tej klasy, twrcy przygotowali klas, jako final. Jeli ty sprbujesz uruchomi ten skrypt PHP, otrzymasz nastpujcy komunikat o bdzie: "Fatal error: Class DerivedMath may not inherit from final class (Math)". ("bd krytyczny: Klasa DerivedMath nie moe dziedziczy z klasy final (Math)".)

Uazz.pl

Strona 41

Deep copy vs shallow copy


Kopiowanie danych jest wanym zadaniem w programowaniu. Obiekt jest to zoony typ danych w OOP. Pola w obiekcie mog by przechowywane przez warto lub przez odwoanie. Kopiowanie mona wykona na dwa sposoby. Pytkie kopiowanie (shallow copy ) kopiuje wszystkie wartoci i odwoania do nowego wystpienia. Dane do ktrego wskazuje odwoanie nie s kopiowane; tylko wskanik jest kopiowany. Nowe odniesienia s skierowane do oryginalnych obiektw. adne zmiany pl odniesienia nie wpywaj na oba obiekty. Gbokie kopie (deep copy) kopiuj wszystkie wartoci do nowego wystpienia. W przypadku pl, ktre s przechowywane, jako gbokie kopie wykonuje gbokie kopii danych, do ktrego istnieje odwoanie. Nowa kopia obiektu tworzona jest przez odwoanie. A wskanik do nowo utworzonego obiektu. Zmiany w tym obiekcie nie wpyn na inne kopie obiektu. Gbokie kopie w peni replikuj obiekty. In PHP, we have a copy keyword, which performs a shallow copy by default. It calls the object's __clone() method. We can implement the method to create our custom deep copy. In PHP 5, all objects are assigned by reference. W PHP mamy sowo kluczowe copy, ktre wykonuje pytkie kopi domylnie. To wywouje metod obiektu __clone(). Uywamy t metod, aby utworzy egzemplarz, przez gbokie kopiowanie. W PHP 5 wszystkie obiekty s przypisane przez referencj. Nastpne dwa przykady wykonaj pytkie i gbokie kopie obiektw.
<?php class Objekt { public $id; public $rozmiar; public $kolor; function __construct($id, $rozmiar, $kolor) { $this->id = $id; $this->rozmiar = $rozmiar; $this->kolor = $kolor; } }

Uazz.pl

Strona 42

class Kolor { public $czerwony; public $zielony; public $niebieski; function __construct($czerwony, $zielony, $niebieski) { $this->czerwony = $czerwony; $this->zielony = $zielony; $this->niebieski = $niebieski; } } $kolor = new Kolor(23, 42, 223); $object1 = new Objekt(23, "maly", $kolor); $object2 = clone $object1; $object2->id++; $object2->kolor->czerwony = 255; $object2->rozmiar = "duzy"; print_r($object1); print_r($object2); ?>

W powyszym skrypcie PHP definiujemy dwa obiekty niestandardowe. Obiekt i Kolor. Obiekt bdzie mia odwoanie do obiektu Kolor.
$kolor = new Kolor(23, 42, 223);

Tworzymy now instancj obiektu Kolor.


$object1 = new Objekt(23, "maly", $kolor);

Tworzona jest instancja klasy Objekt. Wystpienie obiektu Kolor przechodzi do jego konstruktora.
$object2 = clone $object1;

Wykonujemy pytkie kopie obiektu.


$object2->id++; $object2->kolor->czerwony = 255; $object2->rozmiar = "duzy";

Tutaj moemy modyfikowa pola sklonowanego obiektu. Zwikszamy identyfikator, zmieniamy czciowo czerwony kolor obiektu i zmieniamy rozmiar na "duzy".
print_r($object1); print_r($object2);

Uazz.pl

Strona 43

Uywamy funkcji print_r() aby porwna wyniki.


$ php plytkakopia.php

Objekt Object ( [id] => 23 [rozmiar] => maly [kolor] => Kolor Object ( [czerwony] => 255 [zielony] => 42 [niebieski] => 223 ) ) Objekt Object ( [id] => 24 [rozmiar] => duzy [kolor] => Kolor Object ( [czerwony] => 255 [zielony] => 42 [niebieski] => 223 ) ) Widzimy, e identyfikatory s rne. 23 vs 24. Rozmiar jest inny. "may" vs "duzy". Ale kolor czerwony dla obiektu jest taki sam dla obu wystpie. 255. Zmiana wartoci pola obiektu sklonowanego nie mia wpywu na oryginalny obiekt. Zmiana pola odwoania wpyno take na oryginalny obiekt. Innymi sowy oba obiekty odnosz si do tego samego koloru obiektu w pamici. Aby zmieni to zachowanie, zrobimy gbok kopi poniej.

Uazz.pl

Strona 44

<?php class Objekt { public $id; public $rozmiar; public $kolor; function __construct($id, $rozmiar, $kolor) { $this->id = $id; $this->rozmiar = $rozmiar; $this->kolor = $kolor; } function __clone() { $czerwony = $this->kolor->czerwony; $zielony = $this->kolor->zielony; $niebieski = $this->kolor->niebieski; $this->kolor = new Kolor($czerwony, $zielony, $niebieski); } } class Kolor { public $czerwony; public $zielony; public $niebieski; function __construct($czerwony, $zielony, $niebieski) { $this->czerwony = $czerwony; $this->zielony = $zielony; $this->niebieski = $niebieski; } } $kolor = new Kolor(23, 42, 223); $object1 = new Objekt(23, "maly", $kolor); $object2 = clone $object1; $object2->id++; $object2->kolor->czerwony = 255; $object2->rozmiar = "duzy"; print_r($object1); print_r($object2); ?>

W tym skrypcie PHP zaimpletowalimy metod __clone().


function __clone() { $red = $this->kolor->czerwony; $green = $this->kolor->zielony; $blue = $this->kolor->niebieski;

Uazz.pl

Strona 45

$this->kolor = new Kolor($czerwony, $zielony, $niebieski); }

Wewntrz metody __clone() kopiujemy pola czerwony, zielony i niebieski i tworzymy nowy obiekt Kolor. Teraz pole $kolor wskazuje na inny kolor obiektu.
$ php glebokakopia.php

Objekt Object ( [id] => 23 [rozmiar] => maly [kolor] => Kolor Object ( [czerwony] => 23 [zielony] => 42 [niebieski] => 223 ) ) Objekt Object ( [id] => 24 [rozmiar] => duzy [kolor] => Kolor Object ( [czerwony] => 255 [zielony] => 42 [niebieski] => 223 ) ) Teraz kolor czerwony obiektu Kolor nie jest taki sam. Oryginalny obiekt zachowa swoj poprzedni warto 23.

Uazz.pl

Strona 46

Wyjtki
Wyjtki s zaprojektowane do obsugi wystpowania wyjtkw, s to specjalne warunki, ktre zmieniaj tok normalnego wykonywania programu. Wyjtki s wywoywane, wyrzucane lub inicjowane. Podczas realizacji naszej aplikacji wiele rzeczy moe pj le. Dysk moe zosta zapeniony i nie moemy zapisa naszego pliku. Poczenie z Internetem moe zosta przerwane i nasza aplikacja prbuje poczy si z witryn. Wszystko to moe doprowadzi do awarii naszej aplikacji. Aby zapobiec, takim przypadkom, my musimy radzi sobie z wszystkimi moliwymi bdami, ktre mog wystpi. Do tego moemy uy obsugi wyjtkw. Wyjtki zostay dopiero niedawno wprowadzone do jzyka PHP 5. Wikszo bdw PHP nadal uywa starego raportowanie bdw a nie wyjtki. Funkcja set_error_handler() moemy uy do obsugi bdw w skrypcie.
<?php set_error_handler("error_handler"); function error_handler($errno, $errstring, $errfile, $line, $trace) { throw new ErrorException($errstring, $errno, 0, $errfile, $line); } try { $a = 0; $b = 32; $c = $b / $a; } catch(ErrorException $e) { echo " Wystpi bd \n"; echo $e->getMessage(), "\n"; } ?>

W powyszym skrypcie PHP celowo podzielilimy liczb przez zero. Prowadzi to do bdu. Ten bd nie jest wyjtkiem i nie zostaje wychwycony przez sowo kluczowe catch.
set_error_handler("error_handler");

Funkcja set_error_handler() ustawia funkcj obsugi bdw zdefiniowanych przez uytkownika. Uazz.pl Strona 47

function error_handler($errno, $errstring, $errfile, $line, $trace) { throw new ErrorException($errstring, $errno, 0, $errfile, $line); }

Wewntrz funkcji set_error_handler() wrzucamy ErrorException. Wyjtek ten pniej zostanie przechwycony przez sowo kluczowe catch.
try { $a = 0; $b = 32; $c = $b / $a; }

Kod, ktry sprawdzamy przed bdem jest umieszczany wewntrz bloku po sowie kluczowym try.
} catch(Exception $e) { echo $e->getMessage(); }

Sowo kluczowe catch jest uywane do przechwycenia wyjtku, ktry mia miejsce. Aby dowiedzie si wicej, moemy wywoa metod getMessage() na obiekcie wyjtku.
$ php zerodzielenie.php Wystpi bd Division by zero

Powyej wynik dziaania naszego skryptu. Exception jest klas bazow dla wszystkich wyjtkw. Moemy stworzy wasne wyjtki z tej klasy podstawowej.
<?php define("LIMIT", 333); class BigValueException extends Exception { public function __construct($message) { parent::__construct($message); } } $a = 34325; try { if ($a > LIMIT) {

Uazz.pl

Strona 48

throw new BigValueException("Przekroczono maksymaln warto dozwolon \n"); } } catch (BigValueException $e) { echo $e->getMessage(); } ?>

Powiedzmy, e mamy sytuacj, w ktrej nie moemy poradzi sobie z duymi cyframi.
define("LIMIT", 333);

Liczby wiksze od tej staej uznawane s za "due" przez nasz skrypt PHP.
class BigValueException extends Exception {

We have a BigValueException class. This class derives from the Exception class through the extends keyword. Mamy klas BigValueException. Klasa ta wywodzi si z klasy Exception poprzez sowo kluczowe extends.
public function __construct($message) { parent::__construct($message); }

Wewntrz konstruktora moemy wywoa Konstruktor rodzica.


if ($a > LIMIT) { throw new BigValueException("Przekroczono maksymaln warto dozwolon \n"); }

Jeli warto jest wiksza ni limit, rzucamy nasze niestandardowe wyjtek. Podajemy wyjtek komunikat "Przekroczono maksymaln warto dozwolon".
} catch (BigValueException $e) { echo $e->getMessage(); }

Przechwytujemy wyjtek i wywietlamy go na konsoli.

Uazz.pl

Strona 49

Konstruktor przecienia
Konstruktor przecienia nie jest obsugiwany w jzyku PHP. Innymi sowy kada klasa moe mie tylko jeden Konstruktor zdefiniowany. Wielu programistw, zna, rozwizania z jzykw Java czy C# i szuka podobnych funkcji w PHP. Istniej dwa sposoby, aby sobie z tym poradzi. Pierwsze rozwizanie jest oparte na funkcji func_get_args(). Drugie rozwizanie wykorzystuje factory pattern (wzorzec Fabryka).
<?php class Ksiazka { private $tytul = " nie okrelono "; private $autor = " nie okrelono "; private $rok = " nie okrelono "; public function __construct() { $args = func_get_args(); foreach(array("tytul", "autor", "rok") as $item) { if(empty($args)) { break; } $this->$item = array_shift($args); } } public function __toString() { return "Autor: $this->autor\nTytu: $this->tytul\nWydano: $this>rok\n\n"; } } $ksiazka1 = new Ksiazka("Barry Burd", "Java for Dummies"); echo $ksiazka1; $ksiazka2 = new Ksiazka("Paul Wilton", "JavaScript", 2010); echo $ksiazka2; ?>

W skrypcie powyej mamy klas Ksiazka. Moemy utworzy wystpienia klasy 2 i 3 parametrami.
private $tytul = " nie okrelono "; private $autor = " nie okrelono ";

Uazz.pl

Strona 50

private $rok = " nie okrelono ";

Mamy zdefiniowane trzy pola. Ich warto pocztkowa jest "nie okrelona".
$args = func_get_args();

Funkcja func_get_args() zwraca tablic zawierajcy list argumentw funkcji. Wic chodzi o to: kod wewntrz konstruktora jest dynamiczny, to zaley od argumentw przekazywanych do niego.
foreach(array("tytul", "autor", "rok") as $item)

Przechodzimy przez wszystkie pola(zmienne) za pomoc sowa kluczowego foreach.


$this->$item = array_shift($args);

Jednym z najbardziej podstawowych zada konstruktorw jest zainicjowa pola klasy. Odbywa si to w powyszej linii kodu. Funkcja array_shift ()usuwa pierwszy element z tablicy i zwraca go.
$ksiazka1 = new Ksiazka("Barry Burd", "Java for Dummies"); $ksiazka2 = new Ksiazka("Paul Wilton", "JavaScript", 2010);

Mamy dwa rne konstruktory. Pierwszy ma 2 parametry, drugi 3.


$ php konstruktor.php Autor: Java for Dummies Tytu: Barry Burd Wydano: nie okrelono

Autor: JavaScript Tytu: Paul Wilton Wydano: 2010

Jest to wynik dziaania skryptu.

Uazz.pl

Strona 51

W nastpnym przykadzie kodu Konstruktor przecienia symuluje przy uyciu wzorca Fabryki. Fabryka abstrakcyjna (ang. Abstract Factory) jest to jeden z kreacyjnych wzorcw projektowych (obiektowy), ktrego celem jest dostarczenie interfejsu do tworzenia rnych obiektw jednego typu (tej samej rodziny) bez specyfikowania ich konkretnych klas. Umoliwia jednemu obiektowi tworzenie rnych, powizanych ze sob, reprezentacji podobiektw okrelajc ich typy podczas dziaania programu. (Wikipedia)
<?php class Kot { private $imie = "unspecified"; private $wiek = "unspecified"; public static function withName($imie) { $kot = new Kot(); $kot->imie = $imie; return $kot; } public static function withAge($wiek) { $kot = new Kot(); $kot->wiek = $wiek; return $kot; } public static function fullCat($imie, $wiek) { $kot = new Kot(); $kot->imie = $imie; $kot->wiek = $wiek; return $kot; } public function __toString() { return "Imie: $this->imie, Wiek: $this->wiek\n"; } } $cici = Kot::withName("Miau"); echo $cici; $missy = Kot::withAge(8); echo $missy; $tofik = Kot::fullCat("Tofik", 5); echo $tofik; ?>

Uazz.pl

Strona 52

W powyszym skrypcie PHP mamy klas Kot typu wzorzec fabryka. Posiada trzy rne funkcje statyczne. Kada z nich zwraca obiekt kot.
private $name = "unspecified"; private $age = "unspecified";

Mamy dwa pola. Ich warto pocztkowa jest "nieokrelona" (unspecified).


public static function withName($imie) { $kot = new Kot(); $kot->imie = $imie; return $kot; }

Tutaj jest funkcja withName(). Ta funkcja tworzy instancj klasy Kot. Ustawia pole i zwraca obiekt.
$cici = Kot::withName("Cici"); echo $cici;

Tworzymy wystpienie cat z jednej z metod fabryki. Funkcja echo obiektu. np. wywoanie metody __toString() klasy.
$ php factory.php Name: Cici, Age: unspecified Name: unspecified, Age: 6 Name: Lucky, Age: 4

Dane wyjciowe skryptu.

W tej czci kursu PHP kontynuowalimy dyskusj na temat programowania obiektowego w PHP.

Uazz.pl

Strona 53

You might also like