Návrh vlastností Zend Engine 2
Školení, která pořádám
Teprve nedávno se mi dostal do ruky dokument o zamýšlených vlastnostech Zend Engine 2, který je použit v PHP 5. I když je už notně starý (byl vydán v roce 2001), tak bylo zajímavé si ho přečíst, protože vysvětluje, proč byly které vlastnosti zavedeny:
- Hlavní novinkou je změna předávání objektů. V PHP 4 se kopírovaly, v PHP 5 se předávají referencí. Důvodem této změny bylo jednak sjednocení chování s Javou, jednak zjednodušení skriptů a jednak umožnění řady dalších nových vlastností.
- Funkce vracející objekt tedy už nevrací jeho kopii, ale objekt samotný.
- Byla umožněna syntaxe
f()->
.
- Kopírování objektu zajišťuje metoda __clone. O operátoru clone v návrhu zmínka není.
- Byla zavedena podpora destruktorů.
- Byl navržen operátor delete pro odstranění objektu a všech referencí na něj, do jazyka se ale nakonec nedostal.
- Byl sjednocen název konstruktorů, což zjednodušilo volání rodičovských konstruktorů.
- Zvažovalo se přidání vícenásobné dědičnosti. Místo ní dostaly prostor interface.
- Hlavně kvůli zamýšlené vícenásobné dědičnosti se zavedla podpora soukromých vlastností. Ta byla nakonec rozšířena ještě o viditelnost protected.
- Už PHP 4 umožňovalo staticky volat metody, přibyla i podpora statických vlastností.
- Pro snazší ošetření chyb byla zavedena podpora výjimek. Původní návrh nepočítal s uvedením typu výjimky v bloku catch. Na druhou stranu navrhoval zavedení konfigurační direktivy pro vyhazování výjimek interními funkcemi – to se nakonec zajišťuje kódem.
- Interní změna vedla ke zrychlení knihoven pro mapování cizích objektů (např. COM).
- Autoři návrhu zamýšleli oddělit syntaxi pro přístup ke znakům řetězce od syntaxe pro přístup k prvkům pole. To nakonec dopadlo poněkud nešťastně –
$x[0]
i $x{0}
lze použít pro pole i pro řetězce a $x{0}
nakonec bylo označeno za zastaralé.
Novinek PHP 5 bylo nakonec více, i když některé návrhy implementované nakonec nebyly.
Diskuse
"Důvodem této změny bylo jednak sjednocení chování s Javou"
To vidím často.
"Funkce vracející objekt tedy už nevrací jeho kopii, ale objekt samotný"
To je v případě továren díky copy-on-write pouze formalita.
"Byl navržen operátor delete pro odstranění objektu a všech referencí na něj, do jazyka se ale nakonec nedostal."
Občas by se hodil, zvlášť při řešení cyklických referencí. Ale chápu to, mohl by udělat pěkný nepořádek.
"Už PHP 4 umožňovalo staticky volat metody"
No i to bylo v PHP 5 poněkud vylepšeno.
Diskuse je zrušena z důvodu spamu.