27
A PHP 5 újdonságai Az OOP terén

A PHP 5 újdonságai Az OOP terén

  • Upload
    flynn

  • View
    39

  • 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

Page 1: A PHP 5 újdonságai Az OOP terén

A PHP 5 újdonságaiAz OOP terén

Page 2: 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

Page 3: A PHP 5 újdonságai Az OOP terén

Objektum referenciák

Régen – érték szerinti átadásMost – referenciák használataMit befolyásol?

Értékadás

Függvény paraméterek

Page 4: A PHP 5 újdonságai Az OOP terén

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

Page 5: A PHP 5 újdonságai Az OOP terén

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

Page 6: A PHP 5 újdonságai Az OOP terén

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()

Page 7: A PHP 5 újdonságai Az OOP terén

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

Page 8: A PHP 5 újdonságai Az OOP terén

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

Page 9: A PHP 5 újdonságai Az OOP terén

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 …

Page 10: A PHP 5 újdonságai Az OOP terén

Absztrakció

Absztrakt metódusokabstractabstract class

Page 11: A PHP 5 újdonságai Az OOP terén

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 …

Page 12: A PHP 5 újdonságai Az OOP terén

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

Page 13: A PHP 5 újdonságai Az OOP terén

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"

}

Page 14: A PHP 5 újdonságai Az OOP terén

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

Page 15: A PHP 5 újdonságai Az OOP terén

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

Page 16: A PHP 5 újdonságai Az OOP terén

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

Page 17: A PHP 5 újdonságai Az OOP terén

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

Page 18: A PHP 5 újdonságai Az OOP terén

Konstansok

Osztály szintNem változtathatóconst KONSTANS_NEVENincs $ jelOsztaly::KONSTANS_NEVE

Page 19: A PHP 5 újdonságai Az OOP terén

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

Page 20: A PHP 5 újdonságai Az OOP terén

Közvetlen elérés

Függvény, ami objektumot ad visszafuggv()->valtozoHa nincs rá hivatkozva máshol, akkor a szemétbe kerül

Page 21: A PHP 5 újdonságai Az OOP terén

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

Page 22: A PHP 5 újdonságai Az OOP terén

Interfészek

Többszörös öröklés nincsHelyette interfészOlyan mint egy absztrakt metódusokból álló osztályimplements

Page 23: A PHP 5 újdonságai Az OOP terén

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

Page 24: A PHP 5 újdonságai Az OOP terén

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

Page 25: A PHP 5 újdonságai Az OOP terén

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

Page 26: A PHP 5 újdonságai Az OOP terén

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

Page 27: A PHP 5 újdonságai Az OOP terén

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 …