Tento blog je v současné době uzavřen.
Pokračování blogu na bloguje.cz jsem zrušil. Pokud budu někdy pokračovat, bude to spíš tady.
Vůbec ne takové fíčurinky jako filtry, registerNodeClass a podobné, jak o tom píšou machři. Potěšilo by mě mnohem víc, kdyby bylo možné při volání funkce zadat jen některé argumenty, i když jsou v původním pořadí úplně na konci. A zadat argumenty v libovolném pořadí.
Omlouvám se netechnikům za technický příspěvek, kdyžtak si zatím něco čtěte.
Ono samozřejmě jde poslat jen některé argumenty, pokud ty ostatní mají nastavenou defaultní hodnotu. Jenže ty poslané musejí jít zleva podle pořadí, jaké stanovil tvůrce funkce. Takže když mám kód
<?php function zviratko ($velikost="velký", $barva="černý", $zvire="pes") { return "$velikost $barva $zvire";} echo zviratko(); ?>
dostanu podle očekávání „velký černý pes“. Kdybych chtěl dostat „velký černý medvěd“ nebo „velký strakatý tygr“, jak by bylo krásné napsat jenom
<?php echo zviratko($zvire="medvěd"); echo zviratko($zvire="tygr", $barva="strakatý"); // všimněte si obráceného pořadí argumentů ?>
Jenže to nefunguje. Musí se samozřejmě napsat
<?php echo zviratko("velký", "černý", "medvěd"); ?>
Proč mi vadí, že to nejde zjednodušeně? Protože si při volání funkce musím pamatovat správné pořadí argumentů a zbytečně vypisovat i ty, co se jejich hodnota nemění. Což
Kdo si má třeba pamatovat, že v mysql_query se píše nejdřív dotaz a pak nepovinně identifikátor spojení, kdežto v pg_query je to naopak a obojí je povinné? Mít možnost zapsat něco jako mysql_query($link=$connection, $query=$dotaz), to by byla pohoda...
Já vím, dá se to obejít, třeba si udělat funkci tak, aby se do ní posílalo – jako argument – pole a jednotlivé skutečné argumenty byly pojmenované položky pole. Všechno je to ale zbytečná komplikace.
A jazyk prostředí R to umí. Škoda, že PHP (dosud) ne.
Aktualizace: Umí to i Python. Tak vidíte, že to jde, když se chce.
Vložit vlastní komentář – Návrat k článku – RSS komentářů tohoto článku
[1] 14. 11. 2006, 08:17 – LokoN
Zacni pouzivat nejake schopne IDE, ktere ti napovi jake parametry fce ocekava.
[2] 14. 11. 2006, 08:30 – Jakub Podhorský
za 1) tohle musí řešit IDE s nějakou "Intelisence"
a za 2) zase by sis musel pamatovat jména jednotlivých argumentů v čemž nevidím zlepšení ale spíš možná shoršení protože si budeš muset u každý funkce pamatovat každou blbost a "Intelisence" se stejně nevyhneš :)
[3] 14. 11. 2006, 08:48 – Honza Hučín (Odkaz)
Ad [2]: Pamatovat si každou blbost nebude třeba, pokud bude intuitivní a sjednocené. Třeba u databázových funkcí dá rozum, že argument pro dotaz bude $query, pro jméno databáze $dbname a tak.
Podobně u funkcí s regulárními výrazy argumenty $pattern, u hledacích funkcí $search apod.
IDE může pomoct, ale vždycky je lepší takovou věc vyřešit systémově - přímo v jazyku (;
[4] 14. 11. 2006, 08:53 – Jakub Podhorský
[3] to je sice pravda ale je to taky zbytečnej text navíc při kterým se lehko každej přepíše a to ja pak zbytený hledání chyb(i když podobnejch se dá dopustit i u dnešního stylu) a člověk by se měl spíš víc soustředit na řešení problému ne? navíc nebyl bych 2x šťastnej psát třeba v jednom souboru 20 $query = '...' to už je taky malinko na budku :)
[5] 14. 11. 2006, 09:11 – Honza Hučín (Odkaz)
Ad [4]: Souhlasím, že to chyby zcela neodstraní a že to je psaní textu navíc.
Ale kdyby byly povolené obě možnosti - tedy stávající syntaxe bez jmen argumentů i nová syntaxe s pojmenovanými argumenty - bylo by to príma, ne? Podle situace pak můžeš zvolit šikovnější řešení.
Právě ten jazyk prostředí R, o kterém se v článku zmiňuju, umí obojí.
[6] 14. 11. 2006, 09:16 – finc
No tak nevím, mám z toho zvláští pocity. Spíše mi to přijde, jak když jste nepochopil jak funkce pracují :)
Pokud někomu vadí poraří parametrů funkce, není přece takový problém si napsat vlastní. Občas to tímto způsobem dělám.
Co se týče té databáze, pokud použijete OOP přístup, tak nic jako vládání conn ke každému query není potřeba, navíc není to potřeba ani v procedurálním způsobu.
Doporučuji se poohlédnout po objektovém přístupu, pak Vás snad takovéto věci nebudou napadat.
[7] 14. 11. 2006, 09:18 – finc
Jinak přes google.com => eclipse a poté zend php ide eclipse ... výsledkem je jedno z nejlepších IDE pro PHP, srovnatelné se ZEND Studiem a rozdílem zdarma vs. dost peněz ;)
[8] 14. 11. 2006, 09:35 – Věroš Kaplan (Odkaz)
Myslím, že hledáš tohle, ale je to v jiném jazyce?
<python-propaganda>
ht
http://docs.python.o
http://doc
</python-propaganda>
[9] 14. 11. 2006, 09:36 – Honza Hučín (Odkaz)
Ad [6]: Tento článek vznikl jako vedlejší produkt programování vlastních tříd, např. pro přístup k databázím (:
Ano, objektový přístup problémy redukuje. Poté, co jsou třídy odladěny...
[10] 14. 11. 2006, 09:48 – Honza Hučín (Odkaz)
Ad [8]: Jo, to je přesně ono. Díky, aktualizuju článek.
[11] 14. 11. 2006, 10:03 – Jakub Podhorský
[5] nevím podle mě by to do už tak dost chaotického jazyka přineslo jenom další chaos...způsob jakým to má vyřešený PHP a imho spousta dalších a známých jazyků mi naprosto vyhovuje
[12] 14. 11. 2006, 10:04 – dgx (Odkaz)
No, kdyby se takhle volali všechny funkce, byl by to šílený opruz. Místo každého
$s = trim($s);
if (strlen($s) > 10) ...
psát
$s = trim($string=$s);
if (strlen($string=$s) > 10) ...
U většiny funkcí by to spíš překáželo. A pro ty, kde se to využije, nabízí PHP asociativní pole. Jde jen o to zapsat o jedno klíčové slovo a dvě závorky víc... Používám to tady pro databázové objekty, viz dibi::connect().
No a nebo můžu zapisovat:
funkce('parametr', $hodnota, 'parametr2', $jinahodnota);
Ale spíš bych doporučovat nevymýšlet šílenosti :-)
[13] 14. 11. 2006, 10:11 – Aleš Janda (Odkaz)
Kdysi existoval jazyk C-- a v něm bylo možné při volání funkce některý z parametrů vynechat.
Např.: SuperFunkce("Velký",, "medvěd",,,7,9);
Bylo to skvělé, i když té čárky navíc si člověk mnohdy třeba ani nevšiml ;-)
[14] 14. 11. 2006, 10:28 – finc (Odkaz)
A co takhle? :)))
class Zviratko
{
private $velikost = "velky";
private $barva = "cerny";
private $zvire = "pes";
public function setVelikost($velikost)
{
$this->velikost = $velikost;
}
public function setBarva($barva)
{
$this->bar
}
public function setZvire($zvire)
{
$this->zvi
}
public function show()
{
echo $this->velikost ." ". $this->barva ." ". $this->zvire;
}
}
$a = new Zviratko();
$a->show();
$a
$a-&
$a->setBarva("z
$a->show();
[15] 14. 11. 2006, 11:22 – Honza Hučín (Odkaz)
Ad [11]: viz [8] (a [10])
Ad [12]: viz [5]
Ad [13]: ano, dobré částečné řešení, ale pořád si musím pamatovat, kolik čárek mám udělat
Ad [14]: jasně :D
[16] 14. 11. 2006, 12:41 – ivan_d
Jak se zdá, je třeba si nechat zajít chuť:
http://www.php.net/~derick/meeting
[17] 14. 11. 2006, 13:01 – kahi (Odkaz)
a což takle? (netestoval jsem to :))
<?php
function zviratko ($one) {
$all = explode(',', $one);
foreach ($all as $par) {
$par = explode('=', $par);
$$par[0] = $par[1];
}
return "$velikost $barva $zvire";
}
echo zviratko("velikost=velký, barva=černý, zvire=pes");
?>
[18] 14. 11. 2006, 13:10 – Honza Hučín (Odkaz)
Ad [17]: Ale samozřejmě, dá se najít spousta řešení...
Ad [16]: Škoda )':
[19] 14. 11. 2006, 15:00 – LLaik
ad [3]-[2]: no a je to $dbName, $db_name, nebo $dbname? Ci snad jen $name? $database_name? ... radeji spolehat na IDE a komentovany kod (tj. ze mi IDE vypise i popis parametru a jejich typ), nez na to, ze vsechny fce/tridy v projektu budou pouzivat stejne pojmenovani promennych.
Nemluve o tom, ze $dbName ci $databaseName mohou mast tak jako tak.. :(
shrnuto - ze toto PHPko neumi mi ani moc nevadi :)
[20] 14. 11. 2006, 18:07 – Marek
Vidite, mne zase spis vadi, ze kdyz mam funkci:
function nejakaFunkce($a, $b = 1, $c = 3)
.. a chci dodat parametr $c, ale u becka nechat defaultni hodnotu, nejde to jinak, nez ze ji tam pripisu pri volani taky :)
[21] 14. 11. 2006, 18:29 – Mordae (Odkaz)
Ach Velký -nevím-jak-se-jmenuješ-bože-programátorů-ale-
oni
O pojmenovaných argumentech už vývojáři diskutovali a shodli se (protože jsou to céčkaři) na tom, že ne-e. A v PHP vynechávání není proto, že jsou to také lenoši líní. Ale já osobně jsem se ještě nesetkal s potřebou vynechávání, kdy by šlo o víc, než jednu, dvě konstanty. To už radši navrhnu různé funkce, pro různá chování a odstraním tyto argumenty.
[22] 15. 11. 2006, 00:07 – Jakub Podhorský
[21] podle mě by tohle mělo řešit přetěžování metod(funkcí) bohužel ani tohle PHP nepodporuje
navíc takovouhle věc by podle mě mělo IDE řešit už automaticky
[24] 16. 11. 2006, 16:10 – llook (Odkaz)
Obejdu se bez toho, ale taky by se mi to líbilo. Když jsem si zkoušel napsat něco ve wxPython, tato vymyšlenost byla naprosto nepostradatelná.
Kdo nezkusí, neuvěří.
[25] 16. 11. 2006, 16:22 – Trupik (Odkaz)
Mě zase vadí, že v PHP nejsou namespacy. A to by podle mě neměl být takový problém...
[26] 16. 11. 2006, 16:25 – Jakub Podhorský
[25] jedna z mála věcí :) mně hlavně vadí objektovej model PHP :) ale s tím jsem se už tak nějak smířil :)
ale nejvíc na co čekám je podpora unicode(v PHP6)
[27] 17. 11. 2006, 07:38 – Honza Hučín (Odkaz)
Ad [25]: Ano, namespaces je užitečná věc, naštěstí se to dá trochu suplovat pomocí polí nebo objektů (o čemž jsem chtěl vlastně taky někdy napsat).
[28] 22. 11. 2006, 14:09 – Jakub Vrána (Odkaz)
[20] To se dá vyřešit tak, že se jako výchozí hodnota parametrů zvolí NULL a skutečná výchozí hodnota se dosadí až v kódu:
function zviratko($velikost = null, $barva = null) {
if (!isset($velikost)) $velikost = "velký";
if (!isset($barva)) $barva = "černý";
}
zviratko(null, "bílý");
[29] 23. 11. 2006, 07:42 – llook (Odkaz)
[28] Tohleto se mi víc líbí bez ifů:
isset($velikost) or $velikost = "velký";
isset($barva) or $barva = "černý";
K tomuto článku není možné vkládat komentáře.
© Honza Hučín 2004–6
Šuplík běží na PIPNI.CZ. Díky!
8. 8. 16:48 | Pepa
7. 8. 21:26 | Honza Hučín
7. 8. 21:02 | Honza
6. 8. 14:29 | Pepa
3. 8. 18:29 | Honza
*1967, absolvent MFF UK v Praze (1991)
statistik, analytik, programátor, učitel, hudebník