RSS: Vše - Programování



PHP 5.3

02. 03. 2008, 11:44:03,Programování,

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í.

Autor: Pavel Šindelka

Komentáře


[1] (rADAr314) - 02. 03. 2008, 12:35:36
Nádhera... Můžu říct, že na namespaces se těším ze všeho nejvíc... ;-) Rozhodně mi zajímá za jak dlouho napspaces bude používat třeba ZF...
[2] (Libor Fikr) - 02. 03. 2008, 12:58:26
Vítejte "namespaces" ...
[3] (Radek Hulán) - 02. 03. 2008, 14:37:01
"nativní MySQL driver" -- to by mohla být čtvrtá sada funkcí (po mysql, mysql a PDO:mysql) pro přístup k této DB, ne? Fakt "příjemné"...
[4] (Radek Hulán) - 02. 03. 2008, 14:37:19
po mysql, mysqli*
[5] (Pavel Šindelka) - 02. 03. 2008, 15:11:08
ad [3].. No pravda je, že PHP je v tomto značně nesourodé. Nicméně tiše doufám, že koncept se s mysqlnd již výrazně měnit nebude. Zájemci najdou bližší info například na http://blog.felho.hu/what-i...
[6] (geronimo) - 02. 03. 2008, 17:05:54
ad[3] ... Podľa mňa pôjde skôr o nový bin protokol pre komunikáciu medzi PHP a mysql.
[7] (David Grudl) - 02. 03. 2008, 19:24:29
Nativní driver nebude mít novou sadu funkcí. Z hlediska programátora se vlastněn nic nezmění.

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;)
[8] (Pavel Šindelka) - 03. 03. 2008, 19:45:38
ad [7] Díky Davide za další informace, článek jsem doplnil.
[9] (enoice) - 15. 03. 2008, 22:13:07
pěkné... jen nevím proč ke __callstatic nepřidali i __getstatic a __setstatic... líbilo by se mi, kdybych si moh udělat třeba statickou třídu Registry, kam bych si moh ukládat data napřímo Registry::pozdrav = "ahoj" místo třeba Registry::set("pozdrav", "ahoj")... Nebo tohle řešíte nějak jinak?
[10] (David Grudl) - 26. 03. 2008, 01:22:52
Tak termín vypuštění PHP 5.3 se odsouvá, z původně plánovaného prvního kvartálu (který končí za pár dní) na Q2/Q3. Což by taky mohlo být až někdy v září :-(
[11] (Ondra) - 30. 08. 2008, 05:06:08
Hmm, namespaces... :D To je prostě bomba :-) A když vezmu, že třeba už ve verzi 5.4 budou fungovat, tak už padá poslední důvod, proč přecházet k lepším technologiím :-) (fuj to jsem ale jedovatej)
[12] (Pavel Šindelka) - 30. 08. 2008, 13:44:34
[11] Lepším technologiím? Snad jiným. Porovnávat PHP a Javu je nesmyslné už jen proto, že každý z těchto dvou jazyků je určen k něčemu jinému. Ještě před pár lety byly namespaces v PHP zbytečné, používalo se jako jednoduchý skriptovací jazyk (a ve většině případů se tak používá dodnes).
[13] (Jindřich Kubát) - 16. 03. 2009, 09:17:01
Porovnávat JAVU a PHP lze v případě, pokud se používají na stejnou věc ( psaní webových aplikací )

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.
[14] (Zdenek Hejl) - 12. 07. 2009, 14:52:49
Jindřich Kubát:
"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 :)

Komentovat


Tento článek byl uzavřen. Už není možné k němu přidávat komentáře ani hlasovat