PHP: Escapujeme jmenné prostory
Když jsem se před dvěma dny dozvěděl, co se chystá za pěknou změnu v návrhu jmenných protorů do nové desetinkové verze PHP, do verze 5.3, říkal jsem si, že si vývojáři asi museli poplést měsíce, jelikož již dlouho, co apríl byl, a ještě daleko, než zase bude. Jedná se o jednu takovou pěknou syntaktickou libůstku – a to o oddělovač jmenných prostorů. Doposud bylo oddělovačem dvojdvojteččí (::), kteréžto se v PHP používá pro přístup k statickým třídním vlastnostem a metodám. A v tom je právě ten problém – nastaly nejednoznačnosti při volání funkcí. Jednoduchý příklad:
<?php
namespace foo::bar;
function baz()
{
echo "function";
}
namespace foo;
class bar
{
public static function baz()
{
echo "method";
}
}
foo::bar::baz(); // function? method?
Co by se mělo správně vypsat? A je tu vlastně nějaké „správně“?
Když se člověk podívá na takové C++, tak tam se jmenné prostory oddělují pomocí dvojdvojteččí (::) a stejně se přistupuje i k třídním vlastnotem a metodám. Nikde jsem ale neviděl, že by kvůli tomu na C++ někdo nadával, protože ho toto vytrestalo. Proto jsem to zkusil:
#include <iostream>
namespace foo {
namespace bar {
void baz(void)
{
std::cout << "function" << std::endl;
}
}
class bar {
public:
static void baz(void)
{
std::cout << "method" << std::endl;
}
};
}
int main(void)
{
foo::bar::baz();
return 0;
}
A co mi z toho vylezlo? g++ (verze 4.2.1) říká, že prý: Error: symbol `_ZN3foo3bar3bazEv' is already defined. Jelikož jsem chtěl, aby se mi do terminálu vypsal řetězec function, metodě bar::baz() jsem místo přázdného seznamu argumentů dal jeden celočíselný s očekáváním, že g++ najde moji fci baz(void) ve jemnném prostoru foo::bar. Chyba lávky. g++ fci nenašlo a zahlásilo, že ve třídě bar neexistuje metoda baz(void), ale nachází se zde pouze baz(int). U C++ tedy mají jasno – třída definuje svůj vlastní jmenný prostor, který dostává přednost před jmenným prostorem definovaným pomocí namespace (alespoň takto to podle všeho má implementované g++).
Ale v PHP ne. Radši zavedeme nějaký bizarní oddělovač, který se pro tento účel naprosto nehodí (to i ten smajlík, co byl v návrzích (:)), vypadá lépe :o)) – zpětné lomítko je a vždycky bylo v Céčkoidních jazycích znakem pro escapování.
Myslím, že je čas se ještě vážněji než-li do teď zabývat jinými možnostmi programování pro web a jednoduchého skriptování. Python, Ruby? (V případě omezeního se pouze na první přichází v úvahu ještě Java.)
vydáno 27. 10. 2008, 12:27:26

