a php 5 újdonságai
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 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 - PowerPoint PPT PresentationTRANSCRIPT
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
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 * 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ó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
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