Šuplík Honzy Hučína

Skok na navigaci (menu)

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.

Komentovaný článek

Internet a vše kolem
14. 11. 2006

Co mi v PHP chybí

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ž

  • otravuje
  • zdržuje
  • může vést k chybě

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ánkuRSS komentářů tohoto článku

Komentáře

[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>

http://docs.python.org/tut/node6.html#SECTION006600000000000000000
http://docs.python.org/tut/node6.html #SECTION006710000000000000000
http://docs.python.org/tut/node6.html#SECTION006720000000000000000

</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->barva = $barva;
}

public function setZvire($zvire)
{
$this->zvire = $zvire;
}

public function show()
{
echo $this->velikost ." ". $this->barva ." ". $this->zvire;
}
}

$a = new Zviratko();
$a->show();

$a->setVelikost("maly");
$a-&gt;show();

$a->setBarva("zluty");
$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-notes.html#named-parameters

[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-asi-jsi-bez-diakritiky-,
oni chtějí řešit inkompetenci jazyka jeho editorem. Prosím, vážně moc prosím, zapomeňte všichni na IDE. IDE nic neřeší, jen může pomoci s vývojem.

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

[23] 15. 11. 2006, 22:27 – kolemjdouci

LISP

[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!

sber.cermat.cz

RSS Šuplíku

RSS komentářů – souhrnně

U každého článku je samostatný RSS kanál pro komentáře.

Výběr článků

Posledních 10 článků

nebo podle data:

nebo hledání fulltextem:

Archiv všech článků

Poslední komentáře

Zabili mě, parchanti [2]

8. 8. 16:48 | Pepa

Cestou kolem blogu [2]

7. 8. 21:26 | Honza Hučín

Cestou kolem blogu [1]

7. 8. 21:02 | Honza

Vrtulník nad hlavou [3]

6. 8. 14:29 | Pepa

Taková hra na volby [1]

3. 8. 18:29 | Honza

Nejčtenější

Žádné údaje nejsou k dispozici.

O mně

*1967, absolvent MFF UK v Praze (1991)

statistik, analytik, programátor, učitel, hudebník

nyní Ústav pro informace ve vzdělávání

Životopis (RTF)

Napište mi