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.