Upload
flynn
View
41
Download
7
Embed Size (px)
DESCRIPTION
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. - PowerPoint PPT Presentation
Citation preview
A PHP 5 újdonságaiAz 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ásMost – referenciák használataMit 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ódusclone operátorFunkció
Egyedi azonosítók
Erőforrások
$this – klón$that nincs – PHP5 átmásol mindentHa nincs __clone()
Klónozás - Példa
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
Információk elrejtése
Új láthatósági direktívákpublic
protected
private
Metódusok és tagváltozókAlapértelmezett: publicRé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 * 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 …
Absztrakció
Absztrakt metódusokabstractabstract 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évelMost: __construct()Osztály áthelyezés az osztály hierarchiábanOsztály átnevezéseNincs 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ényNincs 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
staticOsztály szintMetódusok: Osztaly::metodus()Változók: Osztaly::$valtozoObjektumból lehet használni a statikus tagokat, fordítva nem$this nincsVá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 szintNem változtathatóconst KONSTANS_NEVENincs $ jelOsztaly::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 visszafuggv()->valtozoHa 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 nincsHelyette interfészOlyan mint egy absztrakt metódusokból álló osztályimplements
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 Osztalyha a $objektum az Osztaly példánya
ha $objektum Osztaly leszármazottjának példánya
$objektum instanceof Interfeszha 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
Eléget
Fatal error: Argument 1 must implement interface Papir in …