270 likes | 407 Views
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. 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.
E N D
Miről lesz szó? • Osztályok kezelése • Új direktívák • Konstruktor • Destruktor • Interfészek
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
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 Objektum referenciák - Példa Fügv: 1 Érték: 2
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 Objektum referenciák – Példa/1 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 nincs – PHP5 átmásol mindent • Ha nincs __clone()
class Gepkocsi { public $rendszam = 1; public $szin; function __clone() { echo "\nklónozok...\n";$this->rendszam = $this->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... Szín: piros Rendszam: 1 Szín: piros Rendszam: 2 Klónozás - Példa
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
class Tavolsag { private $tav; function setKm($km) {$this->tav = $km; } function getKm() { return $this->tav; } public function setMerfold($merfold) {$this->setKm($merfold * 1.609344); } function getMerfold() { return $this->getKm() / 1.609344; }} $d = new Tavolsag();$d->setKm(10);echo "\nMérföld: " . $d->getMerfold();echo "\nKm: " . $d->tav; Mérföld: 6.21371192237 Fatal error: Cannot access private property Tavolsag::$tav in … Információk elrejtése - Példa
Absztrakció • Absztrakt metódusok • abstract • abstract class
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 … Absztrakció - Példa
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
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" } Egységesített konstruktorok - Példa
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
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 Destruktor - Példa
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
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 Statikus tagok - Példa
Konstansok • Osztály szint • Nem változtatható • const KONSTANS_NEVE • Nincs $ jel • Osztaly::KONSTANS_NEVE
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 Konstansok - Példa
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
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 Közvetlen elérés - Példa
Interfészek • Többszörös öröklés nincs • Helyette interfész • Olyan mint egy absztrakt metódusokból álló osztály • implements
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 Interfészek - Példa
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
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 instanceof operátor – Példa 1
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
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 Eléget Fatal error: Argument 1 must implement interface Papir in … Szigorú osztály paraméterek