PHP 5.3
Nová verze PHP už nám klepe na dveře, a tak jsem se rozhodl sesbírat o ní dostupné informace. Vzhledem k tomu, že se dá očekávat, že i po zveřejnění dlouho chystaného PHP 6 se hostingové firmy budou poměrně dlouhý čas bránit přechodu na něj, bude verze 5.3 s velkou pravděpodobností hlavní vlajkovou lodí po několik příštích měsíců, neřku-li let. A už jen proto si jistě zaslouží naši pozornost.Je samozřejmě možné, že výčet nových vlastností nebude úplný, že se do oficiálního vydání ještě něco změní nebo že se všechno prostě chystá jinak - potom prosím těchto věcí znalé, aby vše uvedli na pravou míru v komentářích pod článkem.
Jmenné prostory (namespaces)
Zřejmě nejvýznamnější a také nejvíce očekávanou novou vlastností PHP 5.3 budou jmenné prostory. Jedná se o nástroj, na který PHP vývojáři (zejména ti, kteří tvoří velké projekty a s oblibou používají jiné než vlastní knihovny) čekají již drahnou dobu. Konečně tedy budeme mít nástroj, který nám umožní vyhnout se konfliktům v názvech tříd, aniž bychom museli používat třídy s názvy jako Zend_OpenId_Consumer_Storage_File. A jak to tedy celé bude fungovat?
Prakticky celé kouzlo spočívá v klíčovém slově namespace. Mělo by se používat v každém souboru pouze jednou, a to na jeho začátku. Malý příklad:
<?php
namespace Sindelka::Blog;
class Item {
public function set( $attribute, $value ) {
$this->$attribute = $value;
}
public function show() {
echo 'Blog item name is ' . $this->name;
}
}
?>
Po include výše uvedeného souboru můžeme ke třídě Item přistupovat následujícím způsobem:
$newItem = new Sindelka::Blog::Item();
Druhou možností je použití klíčového slova use, které nám může ulehčit nějaké to psaní (hlavně v případě, že používáme více tříd z jednoho jmenného prostoru). Zápis potom vypadá takto:
use Sindelka::Blog;
$newItem = new Blog::Item();
Možné je také použít klíčové slovo use na konkrétnější úrovni
use Sindelka::Blog::Item;
$newItem = new Item();
nebo využít aliasy:
use Sindelka::Blog::Item as BlogItem;
$newItem = new BlogItem();
Stejným způsobem jako se třídami je možné pracovat i na úrovni funkcí. Pokud potřebujeme odkázat na třídu či funkci, která se nenachází v žádném namespace (resp. nachází se v tzv. "globálním namespace"), lze s úspěchem použít prefix ::.
Začlenění jmenných prostorů do PHP má ještě další vedlejší efekty. Mezi ty nejdůležitější patří například fakt, že funkce jako get_class(), get_parent_class() nebo __autoload nově pracují s plnými názvy tříd včetně namespaces.
Nové chybové úrovně
Byla odstraněna jedna z nelogičností PHP, kdy chybová úroveň E_STRICT nebyla součástí úrovně E_ALL (když už se něco jmenuje ALL.. :)). Zároveň byla z E_STRICT vyděděna množina chyb typu E_DEPRECATED (upozornění na konstrukce a funkce, které přestanou být v nejbližší době podporovány).
Late Static Binding
Jedná se o vlastnost jazyka, která umožňuje zděděné statické metody používat v kontextu potomka. Nejlépe asi ukázat na příkladu. Pokud dnes v PHP napíšete
<?php
class Rodic {
static public function test() {
self::prozrad_se();
}
static public function prozrad_se( ) {
echo "Jsem rodic";
}
}
class Dite extends Rodic {
static public function prozrad_se() {
echo "Jsem dite";
}
}Dite::test();
?>
možná byste očekávali na výstupu větu "Jsem dítě". Ale chyba lávky, statická metoda test se pustí v kontextu třídy Rodič a výsledkem bude věta "Jsem rodič". V PHP 5.3 bude možné očekávaného chování docílit využitím klíčového slova static namísto self v těle metody test().
Magická metoda __callstatic()
Kromě "magických" metod __get(), __set() a __call() bude v nové verzi PHP k dispozici i metoda __callstatic() pro práci se statickými metodami.
Další změny
- nové funkce pro práci s OpenSSL
- nativní mysqlnd driver, který bude specifický pro PHP a slibuje zvýšení výkonu a další vylepšení
- magická konstanta __DIR__ jako náhrada dirname(__FILE__)
- Sqlite3 dostupný i bez PDO přes ext/sqlite extension
- DirectoryIterator z knihovny SPL, který teď implementuje ArrayAccess
- nové možností konfigurace přes INI soubory
- XSLT profiling
- zkrácený ternární operátor ($c = $a ?: $b;)
- drobná vylepšení pro práci s PHP z příkazové řádky
- nové funkce array_replace a array_replace_recursive
Závěr
PHP 5.3 nám přinese výrazné změny a zvýšení komfortu hlavně při práci se jmennými prostory a statickými metodami. Doufejme, že všechno bude fungovat, jak bychom si přáli, a vývojový tým našeho oblíbeného skriptovacího jazyka nás nebude dlouho napínat.
Poznámka: Text článku měním a aktualizuji na základě nově zveřejněných informací a komentářů tak, aby obsahoval co nejméně nepřesností.
Komentáře
Ještě další novinky v PHP 5.3:
- magická konstanta __DIR__ jako náhrada dirname(__FILE__)
- Sqlite3 dostupný i bez PDO
- nové možností konfigurace přes INI soubory
- zkrácený ternární operátor ($c = $a ?: $b;)
Nechci tu rozputat žádný FLAME, jen prezentovat svou cca 1/2 roční zkušenost v psaní větší webové aplikace v JAVĚ, SPRING, TILES, FREEMARKER.
Začnu popořadě:
JAVA - Bezkonkurenčně lepší jazyk, než PHP. No comment
SPRING - Framework pro usnadnění práce a psaní kódu. Na první pohled moc krásná myšlenka, na ten druhý extrémní konfigurace, ve výsledku pomalejší psaní šablon, nutnost znát přesně JAVA BEANS ( padá základní myšlenka MVC )
TILES: Rozdělení Stránek do bloků. Nutnost kompilace při změně, často ani podle dokumentace nedocílím rozdělení podle svých představ. Hledat chybu v tiles je díky nutnosti kompilaci utrpení. Stejně vše řeším přez include ve Freemarker
Freemarker: Šablonovací jazyk. Údajně BEST nástroj na psaní šablon. Nemá žádnou podporu pro náhled dat, se kterými může pracovat ( nutnost znát podrobně JAVA BEANY). Neustále debug. JAVA kódu, abych viděl co mám za data ve Freemarkeru. Neumí přistupovat ke 2D a více Hash. $(data['PRVNI']['DRUHA']) zde proste neudelate. Vzhledem k tomu, ze se zde pisi jiz slozite projekty mate i strukturu 20BEAN v jedne promenne. Des a hruza!
Ve vysledku:
Psani JAVA kodu: cca srovnatelne rychle jako psani PHP kodu + vyhody navic v udrzbe, refaktoringu
Psani sablon a HTML kodu: cca 5x pomalejsi, nez psani u PHP, Smarty, XSLT, Fasttempaltes....
Názoru, že PHP je horší než JAVA se pouze směju.
"JAVA - Bezkonkurenčně lepší jazyk, než PHP. No comment"
"Názoru, že PHP je horší než JAVA se pouze směju."
tak nevím :D
Já používám PHP na jednoduché věci a prakticky nic z toho nového nepoužiju. Možná tak ten zkrácený ternární operátor, pokud se mi nebude plést s jazykem C :)