[ Webhosting ProFiTux.cz ] [ Free game ] [ Sex po telefonu ] [ SPORTOVNÍ VÝŽIVA ] [ České šrotovné ] [ www.Outlet-Prodej.cz ] [ Věštění po telefonu ] [ levné parfémy ] [ Ekologické automobily ] [ Virus A/H1N1 ]
[ Noční košile ] [ Kalhoty a rifle pro celou rodinu ] [ Věštění po telefonu ] [ Zlepšete si handicap! ] [ Evropský Business Portal ] [ EMO účesy ] [ mp3 ke stažení ] [ Obsah.info - tvorba webů ] [ Šortky ]

jakubův notes – programování a vejšplechty

Píšu o:

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

žádný komentář

Zařazeno mezi: