Poznávání PHP

PHP 5 a Zend Engine 2.0

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.


Konstruktory a destruktory

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>";
	}
}
?>


Přístup k metodám a proměnným (Private, Protected)

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é

?>


Konstanty

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í

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
	}
}
?>


Vyjímky

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é

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

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

?>


Klonování objektů

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

?>


Vlastnosti

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.

Petr Rympler