Devel.cz Lupa Měšec Podnikatel Root Zdroják.cz DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Vlákno názorů ke zprávičce PHP mění oddělovač jmenných prostorů na zpětné lomítko

Zdenek aura:65
26. 10. 2008 23:44

doufat je malo?

doufam, ze za tento krok sklidi autori tohoto skvostu hodne kritiky a rozhodnou se pro puvodni reseni, nebo pro nejake z tech, ktere mi lezi v hlavicce...

varianta 1) zakazat definovani funkci ve jmennem prostoru. kdyz uz si hrajeme na objekty, tak znemoznit existenci funkce mimo tridu pri pouziti jmennych prostoru

varianta 2) (psal DG na svem foru) nejdrive zkusit volat funkci a az pote zkusit volat tridu. a nerekl bych, ze by takova magie delala PHPcku ostudu - to uz si udelalo ostudu jinejma vymyslama, tohle by bylo to nejmensi!

varianta 3) zrusit tecku pro spojovani retezcu (nahradit ji treba +... operator scitani mi prijde intuitivnejsi) a pouzit ji jako oddelovac jmenych prostoru. od verze 6 - aby meli koderi cas prizpusobit sve zdrojaky.

docela komicky na me pusobi log chatu mezi vyvojari - padnou argumenty, ze varianta se zpetnym lomitkem je malo citelna a dokonce prakticka zalezitost - ze ma obcas nekdo klavesnici, kde je lomitko uplne nekde v tahu, takze psani kodu se stava velkym utrpenim.

...takze misto reseni 1 nebo 2 se zavedl takovyhle slint :( - holt vymyslet slint je jednodussi nez to vyresit projednou a poradne. uz vidim, jak tahle featura bude za par mesicu deprecated :D
Miloslav Ponkrác aura:75
27. 10. 2008 17:02

Re: doufat je malo?

ad 1) hovadina, která zbytečně omezuje možnosti namespace - není proč to dělat

ad 2) hovadina, pak by náhodně definovaná funkce překryla třídu - a neexistoval by způsob jak zavolat třídu, když by existovala stejnojmenná funkce - tudíž varianta 2) je velmi hloupá, zanášela by spoustu náhodných chyb a ovlivňování svou prostorů identifikátorů - tříd a funkcí. Kterýkoli programátor by mohl zrušit třeba funkčnost libovolného frameworku, nebo knihovny, protože pouhou definicí funkcí by vyřadil, třeba nechtíc stovky jiných modulů. Velmi hloupé řešení je varianta 2).

ad 3) Tak to je asi největší krávovina. Rušit existující operátory v jazyce a dávat jim jiný význam.

P.S.: Docela jsem rád, že nemáte vliv na vývoj PHP (a pokud ano, budu se za PHP modlit). Sice PHP je poněkud nesourodá směs, ale osobně mi řešení, které developeři vymysleli ve všech aspektech přijde asi tak miliónkrát lepší, než cokoli jste navrhnul Vy.
Zdenek aura:65
27. 10. 2008 20:52

Re: doufat je malo?

dobra, kdyz jsou to takove hovadiny, tak mam jeste jeden bod

4) vyhodit error pri shode jmen funkce a tridy. dnes take nemuzu nadefinovat dve funkce stejneho jmena, natoz dve tridy stejneho jmena... tak v cem je problem? kdyz bude programator dodrzovat zazite konvence - tridy velkym pismenem, funkce malym, tak ke kolizi nedojde. a nemusi to byt nijak vynucene. proste hodit error pri konfliktu, a at si to kazdej pise jak chce.
... ale predpokladam, ze i toto je milionkrat horsi, ze?

ostatne, ona je dnes jiz trida zakryta funkci

function foo() {
  echo 'foo 1';
}

class foo {
  function __construct() {
    echo 'foo 2';
  }
}

$a = new foo();

foo();

vypise pouze "foo 1"

Miloslav Ponkrác aura:75
27. 10. 2008 22:45

Re: doufat je malo?

ad 4) Bohužel PHP je dynamický jazyk, stejně jako třeba Python, nebo Ruby. To znamená, že čím méně možností kolizí uděláte, tím lépe, protože kolize se objevují postupně při natahování modulů.

Namespace není v podstatě nic jiného, než velmi silný antikolizní prostředek zabraňující kolizím jmen identifikátorů. K ničemu jinému namespaces neslouží. Bylo by proto trochu nelogické v takovém případě zavádět řešení, které by kolize identifikátorů opět zaváděly, protože se tím zhoršuje to, proč se namespace vůbec používají.

Nejlepší řešení je zkrátka bezkolizní syntaxe, což je to zvolili autoři PHP. Není třeba se drbat levou rukou za pravým uchem, a řešit kolize mezi funkcemi a třídami, když je možné zvolit bezkolizní syntaxi a nic neřešit. Lepší řešení IMHO nenajdete.

Jinak třída není dnes zakryta funkcí, to jste nepochopil syntaxi PHP. new foo() vytvoří novou instanci objektu foo a zavolá konstruktor, tedy metodu __construct(). Neexistuje žádná kolize, protože použijete-li identifikátor foo v kontextu, kde se očekává jméno třídy, jako třeba new foo(), nebo foo::metoda(), pak se zavolá metoda třídy foo. Zatímco volání foo() je jasně volání globální funkce a s žádnou třídou to nemá nic společného. Tím, že za něco zapíšete závorky, prostě voláte funkci, i kdyby existovala stejnojmenného něco jiného ne-funkce.
Zdenek aura:65
27. 10. 2008 23:11

Re: doufat je malo?

na jmenne prostory sem se tesil... i pres vase argumenty ale nesouhlasim, ze to bylo vyresene "nejlepe jak to slo". nevim jak Vy, ale na me klavesnici je zpetne lomitku u backspace... cili, kdyz prehlednu vsecky ty skvele vyhody "skriptovaciho" jazyka, ktere uvadite a vyvracite me vytky, stale tu zustavaji dva problemy:
1) spatna citelnost kodu (lomitko precejen tak dobre graficky neodlisuje dve slova foo\bar proti foo.bar, foo@bar, foo::bar, foo:bar, foo^_^bar, foo (>'')> bar ... a podobne :D)
2) spatna psatelnost kodu (hardwerovy handicap)

proc nebyl pouzit operator ":"?... jen proto ze je soucasti ternarniho operatoru? je tak tezke udelat nejaky parser, kterej zjisti pritomnost otaznicku ve vyrazu? a podle toho rozhodnout jestli se chova tak ci onak? asi by to nebylo tak elegantni, ale v PHP by se tohle vazne ztratilo
Miloslav Ponkrác aura:75
28. 10. 2008 0:47

Re: doufat je malo?

Myslím, že se pohybujeme už na subjektivním poli. Mě je zcela jedno, čím namespace oddělí, hlavně že budou. Vám to jedno není. Máte pravdu Vy i já.

Ohledně ternárního operátoru to mimochodem problém je. Ternární operátor má velmi nízkou prioritu, a jako takový by bylo docela obtížné ho rozumně zpracovat.
Zasílat nově přidané příspěvky e-mailem