Objektno orijentisano programiranje u jeziku PHP

Preview:

Citation preview

Objektno orijentisano programiranje u jeziku PHP

Univerzitet u Beogradu - Elektrotehnički fakultet

Autori:D.Drašković, T.Šekularac, J.Cincović

Izrada klasa, objekata, atributaPolimorfizam, nasleđivanje, redefinisanjeModifikatori pristupaInterfejsiNamespace

Klasa je osnovna jedinica programiranja na OO jezicimaKlase sadrže:

Atribute (svojstva ili promenljive koje opisuju objekat)Operacije (metode, radnje ili funkcije koje objekat može da izvršava)Mehanizme za stvaranje objekata na osnovu definicije(konstruktore)

Enkapsuliranje (skrivanje podataka)Pristup podacima unutar datog objekta moguć samo pomoću operacija tog objekta

Šta je objekat?Jedan primerak (instanca, pojava) klase

3

OO jezici podržavaju polimorfizam: svaki objekat izvedene klase izvršava operaciju onako kako je to definisano u njegovoj (izvedenoj) klasiNasleđivanje: klasa + jedna ili više potklasaPotklasa (izvedena klasa, dete) nasleđuje atribute i operacije od svoje natklase (roditeljske klase)Nasleđivanje omogućava nadgradnju i proširenje postojećih klasa:

class Voziloclass Auto extends Voziloclass Kamion extends Vozilo

4

class ime {var $atribut1;var $atribut2;function operacija1() {}function operacija2($par1, $par2) {}

}

Konstruktor se poziva prilikom pravljenja objekata date klaseKonstruktor se deklariše kao druge operacije, ali ima specijalno ime __construct()

class ime {function __construct($par="") {echo "pozvan je konstruktor sa parametrom $par"; }}

5

Nov objekat se pravi pomoću rezervisane reči newPrimer:$a = new ime('Prvi');$b = new ime('Drugi');$c = new ime();Rezultat:pozvan je konstruktor s parametrom Prvipozvan je konstruktor s parametrom Drugipozvan je konstruktor s parametrom

6

Magične metode su ugrađene metode koje počinju sa '__'. Vidljivost magičnih metoda uvek mora biti javlja.Pozivaju se automatski. Ukoliko ih ne definišemo, izvršavaće se podrazumevano ponašanje ovih metoda.Spisak magičnih metoda:

__construct() i __destruct()__toString()__call() i __callStatic()__get(), __set(), __isset() i __unset()__sleep() i __wakeup()__invoke()__set_state()__clone()__debugInfo()

7

Pokazivač $this upućuje na tekući objekatAko tekući objekat ima atribut $atr, možete da mu pristupite pomoću imena $this->atrPrimer:class ime {

var $atr;function operacija($par) {

$this->atr = $par;echo $this->atr;

}}

8

Primer:class ime {

private $atr;function __get($imeatributa) {

return $this->$imeatributa; }function __set($imeatributa, $nova_vred) {

$this->$imeatributa=$nova_vred; }}

Ove dve metode se pozivaju implicitno$a = new ime();$a->atr = 5; // poziva se funkcija __setecho $a->atr; // poziva se funkcija __get

9

public (javni) - elementima koji se deklarišu kao javni može sepristupati i unutar i izvan klase; atributi su podrazumevano javniprivate (privatni) - elementima koji se deklarišu kao privatnimože se pristupati samo unutar klase i ne može im se pristupitiiz potklasa;protected (zaštićen) - označava da elementu klase može da sepristupi samo unutar klase, ali se tom elementu može pristupitiiz potklasa;class ime {

public $atribut;}

10

Metode __set(), __get(), __isset(), __unset() se pozivajuimplicitno samo u svučaju privatnih, zaštićenih i nepostojećihatributa.

class A {public $javni;protected $zasticeni;private $privatni;var $podrazumevani;

}$a = new A();$a -> javni = 1; //uspesno se izvrsava$a -> zasticeni = 2; //greska: zasticen atribut$a -> privatni = 3; //greska: privatni atribut$a -> podrazumevani = 4; //uspesno se izvrsava$a -> nepoznat = 5; //dodat novi javni atribut11

$a = new ime();

//pristup kao atributu tog objekta

$a->operacija1();$a->operacija2(11,'proba');

//ako operacija vraca neku vrednost

$x = $a->operacija1();$y = $a->operacija2(11,'proba');

12

class A {public $jav1;protected $zas1;private $pri1;function op1() {}

}class B extends A {

public $jav2;protected $zas2;private $pri2;function op2() {}

}$b = new B();var_dump($b);$b->pri1 = 'novi'; // stvara novi atribut pri1

13

Ispis:

object(B)[1]

public 'jav2' => null

protected 'zas2' => nullprivate 'pri2' => null

public 'jav1' => null

protected 'zas1' => null

private 'pri1' (A) => null

Promena postojeće funkcionalnosti natklase u nasleđenoj klasiclass A {

var $atribut = “staravrednost”;function operacija() {

echo 'nesto<br/>';echo “vrednost je $this->atribut”; }

}class B extends A {

var $atribut = “novavrednost”;function operacija() {

echo 'nesto drugo<br/>';echo “vrednost je $this->atribut”; }

}

14

$a = new A();$a->operacija();

Izlaz:nestovrednost je staravrednost

$b = new B();$b->operacija();

Izlaz:nesto drugo //nestovrednost je novavrednost //vrednost je novavrednost

15

Poziva se za izvršavanje operacije iz nadklase

class A {private $pri1;function op1() {$this->pri1 = 'a';}public function __construct($vr){ $this->pri1 = $vr; }

}class B extends A {

function op1() {parent::op1();}public function __construct($vr){ parent::__construct($vr);}

}

16

Služi za sprečavanje nasleđivanjaKada se postavi ispred deklaracije funkcije, ta se funkcija ne može zameniti istoimenom ni u jednoj potklasi:final function operacija() { … }

Upotrebom final se može sprečiti i nasleđivanje određene klase:final class A() { … }

17

C

BA

PHP ne podržava višestruko nasleđivanje.Interfejs deklariše određen broj funkcija koje moraju biti realizovane u svim klasama koje realizuje taj interfejs.interface Prikazuje {

function prikazi ();}class MyClass implements Prikaz {

function prikazi() {...}}

Interfejs se koristi kao “zaobilazni” način da se realizuje višestruko nasleđivanje

18

Trait predstavlja skup funkcija. Nije ga mogućeinstancirati niti ili bilo koje drugo svojstvo klasa.

trait MyTrait {function show() {…};

}class MyClass extends MyBasicClass {

use MyTrait;}

Trait smanjuje redudantnost koda, jer se skup funkcijajednom implementira, a zatim se samo uveze u svepotrebne klase.

19

const - konstanta klase, koja se koristi bez obaveze da se napravi objekat.class Matematika {

const pi = 3.14159;public const e = 2.71828;

}echo 'Pi je '.Matematika::pi;echo 'E je '.Matematika::e;

20

Kada je zadata ispred deklaracije metode, omogućava da se poziva metoda bez pravljenja instance klase:static function kvadrat($broj) {

return $broj*$broj; }echo 'Kvadrat od 8 = '.Matematika::kvadrat(8);

Kada je zadata ispred deklaracije atributa, stvara se atribut bez pravljenja instance klase.

Self:: - statički referencira klasuStatic:: - dinamički referencira klasu

21

<?php //Student.phpclass Student {

public $firstName;public $lastName;public function __construct($firstName, $lastName = '') { //Optional parameter

$this->firstName = $firstName;$this->lastName = $lastName;

}public function greet() {

return "Hello, my name is " . $this->firstName . " " . $this->lastName . ".";

}public static function staticGreet($firstName, $lastName) {

return "Hello, my name is " . $firstName . " " . $lastName . ".";

}}?>

<?php //index.phprequire("Student.php");$demon1 = new Student('Stefan', 'Kostic');$demon2 = new Student('Mina', 'Reljic');$demon3 = new Student('Filip Zivkovic');

echo $demon1->greet();echo '<br />';echo $demon2->greet();echo '<br />';echo $demon3->greet();echo '<br />';echo Student::staticGreet('Balsa', 'Bojic');

?>

Korišćenjem imenskog prostora (namespace) vrši se formiranje imenovanih oblasti tako da dve različiteimenovane oblasti mogu da sadrže funkcije ipromenljive istog naziva.

Namespace se može definiše na dva načina:Na početku fajla i onda važi na nivou celog fajlanamespace myNamespace;Na bilo kom mestu unutar fajla, ali se onda kod koji pripada tom namespacu stavlja u vitičaste zagradenamespace myNamespace {

…}

Ukoliko se ne defineše namespace, koristi se globalni namespace.Subnamespace je namespace koji se nalazi unutarnekog drugog namespace-anamespace myNamespace/subnamespace;

Elementima koji se nalaze u drugom namespace-u se može pristupiti navodjenjem naziva namespace-a ispred njenog naziva.myNamespace\func(); \\ poziv funkcije iz myNamespace\func(); \\ poziv funkcije iz globalnog namespace-a

Za pozive iz odredjenog namespace-u i pozivanjeelemenata koji se nalaze u njegovom subnamespace-u dovoljno je da se navede samo naziv subnamespace-a.

Kako se ne bi stalno navodio i naziv namespace-a, može se definisati alias preko koga se može pristupatipomoću use komande.use myNamespace\myClass as newClassName;use myNamespace\myClass as myClass;use myNamespace\myClass; // ovo ima isto značenje

kao i prethodna istrukcija

use function myNamespace\functionName; use const myNamespace\CONSTANT;

Funkcija spl_autoload_register za automatsko ucitavanje fajlova.

spl_autoload_register(function ($class) {

include 'classes/’. $class . '.class.php’;

});$obj = new myClass();

Ovim mehanizmom se omogućavava da se koriste klase iz drugih fajlova bez njihovog uvezivanja pomoću include ili require.

Koncepti obrade izuzetakaKlasa ExceptionIzuzeci koje korisnik definiše

Kod se izvršava unutar try bloka:try {

//kod}Unutar try bloka izuzetak se izaziva:throw new Exception('poruka', broj_greske);Svakom bloku try mora da sledi barem jedan blok catch:catch (Exception $e) {

//obrada izuzetka}Objekat koji se prosleđuje bloku catch (da bi ga blok presreo) jeste objekat prosleđen iskazu throw koji je generisao izuzetak.

30

<?phptry {throw new Exception('Greska!!!', 42);

}catch (Exception $e){

echo 'Exception '.$e->getCode().': '.$e-> getMessage().'<br />'.' u fajlu '. $e->getFile(). 'na liniji '. $e->getLine(). '<br />';

}?>

31

Konstruktor te klase prihvata 2 parametra: tekst poruke o grešci i broj greškegetCode() - vraća broj greške koji je bio prosleđen konstruktorugetMessage() - vraća tekst poruke koja je bila prosleđena konstruktorugetFile() - pozivajućem kodu vraća punu putanju datoteke u kojoj je generisan

izuzetakgetLine() - vraća broj reda koda u kome je generisan izuzetakgetTrace() - vraća niz s podacima o stablu pozivanja koji omogućavaju

utvrđivanje mesta na kome je generisan izuzetakgetTraceAsString () - vraća iste podatke kao getTrace(), formatirane kao

znakovni podaci__toString() - omogućava da se iskazu echo direktno prosledi ceo sadržaj

objekta Exception, sa svim podacima koje daju navedene metode

32

Služi za konekciju između PHP i MySQL, pomoću OOPrimer:

$conn = new mysqli(“localhost", “root", "", “akcije");if ($ conn->connect_errno){printf("Connect failed: %s\n", $conn->connect_error);exit();

}$query = "SELECT * FROM Korisnik";if ($result = $conn->query($query)) {

while($obj = $result->fetch_object()){//…

}$result->close();

}$conn->close();

Služi za konekciju između PHP i baze, pomoću OOSinopsis:

PDO {public __construct ( string $dsn [, string $username [, string $passwd

[, array $options ]]] )public beginTransaction ( void ) : boolpublic commit ( void ) : boolpublic errorCode ( void ) : stringpublic errorInfo ( void ) : arraypublic exec ( string $statement ) : intpublic getAttribute ( int $attribute ) : mixedpublic static getAvailableDrivers ( void ) : arraypublic inTransaction ( void ) : boolpublic lastInsertId ([ string $name = NULL ] ) : stringpublic prepare ( string $statement [, array $driver_options = array() ] ) : PDOStatementpublic query ( string $statement ) : PDOStatementpublic quote ( string $string [, int $parameter_type = PDO::PARAM_STR ] ) : stringpublic rollBack ( void ) : boolpublic setAttribute ( int $attribute , mixed $value ) : bool

}

Hvala!

Recommended