A PHP 5 újdonságai Az OOP terén
Miről lesz szó? Osztályok kezelése – Új direktívák – Konstruktor – Destruktor Interfészek Kivételkezelés
Szóhasználat Metódus Változó Tag változó Tag függvény Függvény Osztály Objektum Példány
Objektum referenciák Régen – érték szerinti átadás Most – referenciák használata Mit befolyásol? – Értékadás – Függvény paraméterek
Objektum referenciák - Példa class Gyumolcs { var $suly = 0; } function erik($gyumolcs) { $gyumolcs->suly++; } $gyumolcs = new Gyumolcs(); erik($gyumolcs); echo "\nFügv: ". $gyumolcs->suly; $gy1 = $gyumolcs; $gy1->suly++; echo "\nÉrték: ". $gyumolcs->suly; Fügv: 0 Érték: 0 Fügv: 1 Érték: 2
Objektum referenciák – Példa/1 class Gyumolcs { var $suly = 0; } function erik(&$gyumolcs) { $gyumolcs->suly++; } $gyumolcs = new Gyumolcs(); erik($gyumolcs); echo "\nFügv: ". $gyumolcs->suly; $gy1 = &$gyumolcs; $gy1->suly++; echo "\nÉrték: ". $gyumolcs->suly; Fügv: 1 Érték: 2 Fügv: 1 Érték: 2
Klónozás A referenciák miatt szükséges __clone() metódus clone operátor Funkció – Egyedi azonosítók – Erőforrások $this – klón $that – eredeti objektum Ha nincs __clone()
Klónozás - Példa class Gepkocsi { public $rendszam = 1; public $szin; function __clone() { echo "\nklónozok...\n"; var_dump($that); $this->rendszam = $that->rendszam + 1; } function kiir() { echo "\nSzín: ". $this->szin. " Rendszam: ". $this->rendszam; } } $g = new Gepkocsi(); $g->szin = 'piros'; $g1 = clone $g; $g->kiir(); $g1->kiir(); klónozok... NULL Szín: piros Rendszam: 1 PHP5.0.0RC1 hiba: $that értéke NULL
Információk elrejtése Új láthatósági direktívák – public – protected – private Metódusok és tagváltozók Alapértelmezett: public Régi kódolási konvenció: aláhúzás jel
Információk elrejtése - Példa class Tavolsag { private $tav; function setKm($km) { $this->tav = $km; } function getKm() { return $this->tav; } public function setMerfold($merfold) { $this->setKm($merfold * ); } function getMerfold() { return $this->getKm() / ; } } $d = new Tavolsag(); $d->setKm(10); echo "\nMérföld: ". $d->getMerfold(); echo "\nKm: ". $d->tav; Mérföld: Fatal error: Cannot access private property Tavolsag::$tav in …
Absztrakció Absztrakt metódusok abstract abstract class
Absztrakció - Példa abstract class Kiadvany { abstract function kolcsonoz($kinek); } class Konyv { function kolcsonoz($kinek) { echo "\nKönyv kölcsönzés: ". $kinek; } } class Folyoirat { function kolcsonoz($kinek) { echo "\nFolyóirat kölcsönzés: ". $kinek; } } $k = new Konyv(); $k->kolcsonoz('nekem'); $k = new Folyoirat(); $k->kolcsonoz('nekem'); $k = new Kiadvany(); $k->kolcsonoz('nekem'); Könyv kölcsönzés: nekem Folyóirat kölcsönzés: nekem Fatal error: Cannot instantiate abstract class Kiadvany in …
Egységesített konstruktorok Régen: konstruktor egyezett az osztály nevével Most: __construct() Osztály áthelyezés az osztály hierarchiában Osztály átnevezése Nincs automatikus szülő konstruktor hívás
Egységesített konstruktorok - Példa class HtmlTag { public $tag; function __construct($tag) { $this->tag = $tag; } } class FontTag extends HtmlTag { public $font_nev; public $meret; function __construct($font_nev, $meret) { parent::__construct('font'); $this->font_nev = $font_nev; $this->meret = $meret; } } $font = new FontTag('Verdana', 8); var_dump($font); object(FontTag)#1 (3) { ["font_nev"]=> string(7) "Verdana„ ["meret"]=> int(8) ["tag"]=> string(4) "font" }
Destruktor Erőforrások felszabadítás (adatbázis, fájlok) Szemét gyűjtő __destruct() függvény Nincs automatikus szülő destruktor hívás
Destruktor - Példa class FileKezelo { public $file; function __construct($file_nev) { $this->file = fopen($file_nev, 'r'); } function __destruct() { echo "\nDestruktor\n"; var_dump($this->file); fclose($this->file); echo "\nfile bezárva"; } } $f = new FileKezelo('destruktor.php'); $f = null; echo "\nVége"; Destruktor resource(4) of type (stream) file bezárva Vége
Statikus tagok static Osztály szint Metódusok: Osztaly::metodus() Változók: Osztaly::$valtozo Objektumból lehet használni a statikus tagokat, fordítva nem $this nincs Változók csak egyszer foglalnak memóriát nem objektumonként
Statikus tagok - Példa class Vallalat { private static $utolso_vallalat_id = 1; public $id; function __construct() { $this->id = Vallalat::$utolso_vallalat_id++; } } $v1 = new Vallalat(); $v2 = new Vallalat(); echo "\nV1: ". $v1->id; echo "\nV2: ". $v2->id; V1: 1 V2: 2
Konstansok Osztály szint Nem változtatható const KONSTANS_NEVE Nincs $ jel Osztaly::KONSTANS_NEVE
Konstansok - Példa class FileKezelo { const MOD_CSAK_OLVASHATO = 'r'; const MOD_IRHATO_OLVASHATO = 'r+'; public $file; function __construct($file_nev, $mod) { echo "\nMód: ". $mod; $this->file = fopen($file_nev, $mod); } function __destruct() { echo "\nDestruktor\n"; var_dump($this->file); fclose($this->file); echo "\nfile bezárva"; } } $f = new FileKezelo('konstans.php', FileKezelo::MOD_CSAK_OLVASHATO); $f = null; echo "\nVége"; Mód: r Destruktor resource(4) of type (stream) file bezárva Vége
Közvetlen elérés Függvény, ami objektumot ad vissza fuggv()->valtozo Ha nincs rá hivatkozva máshol, akkor a szemétbe kerül
Közvetlen elérés - Példa class Pont { public $x, $y; function __construct($x, $y) { $this->x = $x; $this->y = $y; } } class Teglalap { private $bal_felso, $jobb_also; function __construct($x1, $y1, $x2, $y2) { $this->bal_felso = new Pont($x1, $y1); $this->jobb_also = new Pont($x2, $y2); } function jobbAlso() { return clone $this->jobb_also; } } $t = new Teglalap(10, 20, 30, 40); echo "Jobb alsó: "; var_dump($t->jobbAlso()); echo "\nJobb X: ". $t->jobbAlso()->x; Jobb alsó: object(Pont)#3 (2) { ["x"]=> int(30) ["y"]=> int(40) } Jobb X: 30
Interfészek Többszörös öröklés nincs Helyette interfész Olyan mint egy absztrakt metódusokból álló osztály implements
Interfészek - Példa interface Papir { function eg(); } class Penz { function fizet() { echo "\nFizetek"; } } class PapirPenz extends Penz implements Papir { function eg() { echo "\nÉgek";; } } $pp = new PapirPenz(); $pp->fizet(); $pp->eg(); Fizetek Égek
instanceof operátor $objektum instanceof Osztaly – ha a $objektum az Osztaly példánya – ha $objektum Osztaly leszármazottjának példánya $objektum instanceof Interfesz – ha a $objektum olyan osztaly példánya, amely implementálja az Interfesz-t – ha a $objektum olyan osztaly leszármazottjának példánya, amely implementálja az Interfesz-t
instanceof operátor – Példa 1 interface Papir { function eg(); } class Penz {} class FemPenz extends Penz {} class PapirPenz extends Penz implements Papir { function eg() { echo "\nÉgek";; } } class NagyCimlet extends PapirPenz {} $p = new Penz(); $fp = new FemPenz(); $pp = new PapirPenz(); $nc = new NagyCimlet(); $p instanceof Penz igaz $fp instanceof Penz igaz $pp instanceof Papir igaz $nc instanceof Papir igaz $p instanceof PapirPenz hamis $fp instanceof PapirPenz hamis $fp instanceof Papir hamis
Szigorú osztály paraméterek function X(Osztaly $param) function X(Interfesz $param) instanceof vizsgálat a függvény végrehajtása előtt
Szigorú osztály paraméterek interface Papir { function eg(); } class Penz {} class FemPenz extends Penz {} class PapirPenz extends Penz implements Papir { function eg() { echo "\nÉgek";; } } class NagyCimlet extends PapirPenz {} function eleget(Papir $papir) { echo "\nEléget"; } $p = new Penz(); $fp = new FemPenz(); $pp = new PapirPenz(); $nc = new NagyCimlet(); eleget($pp); eleget($nc); eleget($fp); Eléget Fatal error: Argument 1 must implement interface Papir in …
Kivételkezelés Hiba esetén leállás helyett kivételt „dob” A kivétel megfogható try { … } catch (KivetelOsztaly $kivetel) {} Elindul a kódban visszafelé A dobott kivétel osztályának megfelelő catch blokk végrehalytása A blokk utáni következő utasítással folytatódik Meg nem fogott kivételek