V dneÜnφm dφlu si povφme n∞co o novΘ verzi PHP 5, kterß b∞₧φ pod nov²m Zend Engine 2. PHP dosßhlo znaΦn²ch zm∞n zejmΘna po objektovΘ strßnce. P°ibyly dalÜφ vymo₧enosti jako nap°φklad odchytßvßnφ v²jimek pomocφ bloku try ... catch, rozhranφ, statickΘ metody a prom∞nnΘ, kompletn∞ p°epracovanß podpora XML, atd. PHP 5 se nynφ nachßzφ ve verzi PHP 5.0 Beta 3, co₧ by m∞la b²t ji₧ poslednφ beta verze (doufejme ;-). Nynφ si tyto zm∞ny popφÜeme.
Pomocφ konstruktoru m∙₧eme nap°φklad inicializovat prom∞nnΘ t°φdy p°i vytvo°enφ jejφ instance. Opakem je destruktor, kter² je volßn p°i uvoln∞nφ t°φdy z pam∞ti. V d°φv∞jÜφch verzφch PHP musel mφt konstruktor stejn² nßzev jako byl nßzev t°φdy.
V PHP 5 konstruktor vytvo°φme jako funkci "__construct" a destruktor jako t°φdu "__destruct". Pro zp∞tnou kompatibilitu pokud PHP nenalezne funkci "__construct", hledß se funkce stejnΘho nßzvu jako je t°φda (pro zachovßnφ funkΦnosti). Nynφ si konstruktor a destruktor ukß₧eme na p°φklad∞.
<?php class Auto { var $typ; // Konstruktor function __construct($typ) { this->typ = $typ; echo "Vytvo°enφ instance <br>"; } // Destruktor function __destruct() { echo "Uklidφme po sob∞ :) <br>"; } } ?>
Pomocφ modifikßtor∙ Private a Protected m∙₧eme ovlivnit viditelnost metod a prom∞nn²ch v t°φdßch. V d°φv∞jÜφch verzφch PHP byly vÜechny prom∞nnΘ a funkce p°φstupnΘ zvenΦφ (Public), nynφ jejich viditelnost a prßci s nimi m∙₧eme ovlivnit pomocφ t∞chto modifikßtor∙.
Modifikßtorem Private nastavφme, ₧e p°φstup k funkci nebo prom∞nnΘ bude pouze uvnit° t°φdy. Modifikßtorem Protected nastavφme p°φstup pouze uvnit° t°φdy nebo v t°φd∞ odvozenΘ.
<?php class Auto { private $typ; protected $rychlost; public function Info() { echo "Typ: " . $this->typ . "<br>"; echo "Rychlost: " . $this->rychlost; } protected function Load() { $this->typ = 1; $this->rychlost = 220; } } class Moto extends Auto { public function Nacti() { $this->Load(); // Nastavφ po₧adovanΘ hodnoty } } $auto = new Auto(); echo $auto->typ; // Nezobrazφ nic echo $auto->rychlost; // Nezobrazφ nic $auto->Info(); // Zobrazφ po₧adovanΘ informace $auto->Load(); // Nefunguje, nejsme ve stejnΘ t°φd∞ nebo t°φd∞ odvozenΘ $moto = new Moto(); $moto->Nacti(); // Funguje, jsme v t°φd∞ odvozenΘ ?>
Nynφ m∙₧eme deklarovat uvnit° ka₧dΘ t°φdy konstanty. StarÜφ k≤d pob∞₧φ op∞t beze zm∞n.
<?php class Auto { const rychlost = 200; } echo "Rychlost: " . Auto::rychlost; ?>
Rozhranφ je t°φda, kterß pouze definuje jmΘna metod a parametry, kterΘ metody mohou mφt.
<?php interface iPrint { function Print(); } interface iManage { function Manage(); } class Auto implements iPrint,iManage { function Print() { // Vykonßme urΦit² k≤d } function Manage() { // Vykonßme urΦit² k≤d } } ?>
PHP 5 p°ichßzφ s podporou odchytßvßnφ vyjφmek, kterß se znaΦn∞ podobß ostatnφm jazyk∙m (C#, Java, C++ atd.). Vyjφmky m∙₧eme obsluhovat pomocφ blok∙ try...catch...finally. V p°φpad∞, ₧e se vyskytne vyjφmka (chyba) m∙₧eme ji zpracovat (nap°. chybovΘ hlßÜenφ) v bloku try...catch. Do bloku finally m∙₧eme napsat k≤d, kter² se vykonß v₧dy po odchycenφ vyjφmek (nap°. uzav°enφ databßzovΘho spojenφ atd.).
<?php class Auto { public function Load() { // P°ipojenφ k SQL serveru - p°φpadnΘ zpracovßnφ dat } } $auto = new Auto(); try { $auto->Load(); } catch (Exception $ex) { echo "Nastala chyba: " . $ex->getMessage(); // Vykonßnφ nßmi zvolenΘho k≤du } finally { // K≤d vykonan² na zßv∞r } ?>
M∙₧eme takΘ vytvß°et vlastnφ chybovΘ hlßÜenφ, kdy staΦφ vytvo°it t°φdu odvozenou od t°φdy Exception, je₧ bude obsahovat konstruktor a funkci getMessage().
<?php class Vyjimka extends Exception { private $info; function __construct($info) { parent::exception(); this->info = $info; } function getMessage() { return "Nastala chyba: ". $this->info; } } ?>
StatickΘ metody a prom∞nnΘ jsou takovΘ, kterΘ m∙₧eme zavolat bez vytvo°enφ instance objektu. Pro nastavenφ pou₧ijeme modifikßtor static.
<?php class Auto { static rychlost = 200; public static function Info() { // UrΦit² k≤d } } // Zavolßnφ metody Auto::Info(); echo Auto::rychlost; ?>
JmennΘ prostory m∙₧eme vyu₧φvat k seskupenφ a zp°ehledn∞nφ k≤du.
<?php namespace Projekty { class Auto { public function Info() { // UrΦit² k≤d } } } // Vytvo°enφ instance $auto = new Projekty::Auto(); ?>
Nynφ m∙₧eme vytvo°it kopii instance t°φdy jednoduÜe zavolßnφm metody __clone.
<?php class Auto { public function Info() { // UrΦit² k≤d } } // Klonovßnφ objektu $auto = new Auto(); $auto->Info(); // Novß kopie $autoNove = $auto->__clone(); ?>
Op∞t jako v jin²ch objektov∞ orientovan²ch jazycφch p°ichßzejφ v PHP 5 vlastnostmi. Vlastnosti odd∞lujφ a zp°ehled≥ujφ celkovΘ uspo°ßdßnφ t°φd. P°i zφskßvßnφ a nastavovßnφ hodnot vyu₧φvßme tzv. Getter a Setter metody.
<?php class Auto { function __set($promenna, $hodnota) { // UrΦit² k≤d } function __get($promenna) { // UrΦit² k≤d } } ?>
Toto byly ty nejzßkladn∞jÜφ informace o novΘ verzi PHP 5. O dalÜφch informacφch si povφme po uvedenφ finßlnφ verze PHP 5.
Pro tento dφl to bude vÜe. V p°φÜtφm dφle budeme dßle pokraΦovat v poznßvßnφ jazyka PHP.