abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 18:22 | Nová verze

    Byla vydána verze 0.2.0 v Rustu napsaného frameworku Pingora pro vytváření rychlých, spolehlivých a programovatelných síťových systémů. Společnost Cloudflare jej letos v únoru uvolnila pod licencí Apache 2.0.

    Ladislav Hagara | Komentářů: 0
    10.5. 19:11 | Nová verze

    Open source RDP (Remote Desktop Protocol) server xrdp (Wikipedie) byl vydán ve verzi 0.10.0. Z novinek je vypíchnuta podpora GFX (Graphic Pipeline Extension). Nová větev řeší také několik bezpečnostních chyb.

    Ladislav Hagara | Komentářů: 7
    10.5. 04:11 | Nová verze

    Rocky Linux byl vydán v nové stabilní verzi 9.4. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    9.5. 22:22 | Bezpečnostní upozornění

    Dellu byla odcizena databáze zákazníků (jméno, adresa, seznam zakoupených produktů) [Customer Care, Bleeping Computer].

    Ladislav Hagara | Komentářů: 19
    9.5. 21:11 | Zajímavý článek

    V lednu byl otevřen editor kódů Zed od autorů editoru Atom a Tree-sitter. Tenkrát běžel pouze na macOS. Byl napevno svázán s Metalem. Situace se ale postupně mění. V aktuálním příspěvku Kdy Zed na Linuxu? na blogu Zedu vývojáři popisují aktuální stav. Blíží se alfa verze.

    Ladislav Hagara | Komentářů: 32
    9.5. 14:33 | Pozvánky

    O víkendu 11. a 12. května lze navštívit Maker Faire Prague, festival plný workshopů, interaktivních činností a především nadšených a zvídavých lidí.

    Ladislav Hagara | Komentářů: 0
    8.5. 21:55 | Nová verze

    Byl vydán Fedora Asahi Remix 40, tj. linuxová distribuce pro Apple Silicon vycházející z Fedora Linuxu 40.

    Ladislav Hagara | Komentářů: 20
    8.5. 20:22 | IT novinky

    Představena byla služba Raspberry Pi Connect usnadňující vzdálený grafický přístup k vašim Raspberry Pi z webového prohlížeče. Odkudkoli. Zdarma. Zatím v beta verzi. Detaily v dokumentaci.

    Ladislav Hagara | Komentářů: 7
    8.5. 12:55 | Nová verze

    Byla vydána verze R14.1.2 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5). Přehled novinek v poznámkách k vydání, podrobnosti v seznamu změn.

    JZD | Komentářů: 0
    7.5. 18:55 | IT novinky

    Dnešním dnem lze již také v Česku nakupovat na Google Store (telefony a sluchátka Google Pixel).

    Ladislav Hagara | Komentářů: 10
    Podle hypotézy Mrtvý Internet mj. tvoří většinu online interakcí boti.
     (64%)
     (7%)
     (13%)
     (15%)
    Celkem 163 hlasů
     Komentářů: 11, poslední 10.5. 18:00
    Rozcestník

    Dotaz: Jak můžu vrátit funkcí 2 proměnné

    24.3.2012 20:53 Dušan S.
    Jak můžu vrátit funkcí 2 proměnné
    Přečteno: 1919×
    Ahoj, jak můžu vrátit funkcí 2 proměnné, jednu proměnnou vracím pomocí return $prom_jedna ale potřeboval bych dostat ven ještě jednu proměnnou $prom_dve, která bude vždy buď true or false. Nechci používat global $prom_dve a $prom_jedna je pole, tak že tam to taky nejde použít jelikož testuji nějaký výskyt v tomto poli. Díky za pomoc

    Řešení dotazu:


    Odpovědi

    24.3.2012 21:11 Vlk
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Možná jsem to jenom přehlídl, ale nikde jsi nenapsal v jakém jazyku to chceš udělat.

    Dost by to pomohlo v zodpovězení tvého dotazu :-)
    24.3.2012 21:23 Dušan S.
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Je to v PHP sorry :(
    24.3.2012 21:40 lertimir | skóre: 64 | blog: Par_slov
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Už 30 let se předávají parametry do procedury/funkce hodnotou nebo odkazem. Parametr předaný odkazem je možné použít na vrácení hodnoty, protože se předává odkaz na paměťové místo, kde je proměnná umístěna, a veškeré operace v proceduře se provádějí přímo na vnější proměnné. V PHP je předání parametru odkazem tuším konstrukcí &&;$cislo
    24.3.2012 21:49 DK
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    nebo to proste vratit v poli
    24.3.2012 22:31 Dušan S.
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Moc tomu nerozumím, můžeš nazorný příklad? Tu prom $name potřebuji dostat ven jako var_dump($name); TRUE;
    function returnTwoValue(){
    
    $array = array();
    $array[] = '............';
    $array[] = '........................';
    
    $name = true;
    
    return $array;
    }
    Dík
    24.3.2012 22:46 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    <?php
    
    function returnTwoValue(){
      $array = array();
      $array[] = '............';
      $array[] = '........................';
      $name = true;
      return array('val' => $array, 'name' => $name);
    }
    print_r(returnTwoValue());
    
    function returnTwoValueRef(&$array){
      $array = array();
      $array[] = '............';
      $array[] = '........................';
      $name = true;
      return $name;
    }
    $var = NULL;
    print_r(returnTwoValueRef($var));
    print_r($var);
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    24.3.2012 23:11 Dušan S.
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Hm, ted to mám teda takto
    function returnTwoValue($a, $b){
    
      $array = array();
      $array[] = '............';
      $array[] = '........................';
      return $array;
    }
    
    a volat to takto
    $myVal = returnTwoValue($a, $b);
    a potřebuji teda další proměnnou tak to má být takto?
    function returnTwoValue($a, $b, &$name){
      $array = array();
      $array[] = '............';
      $array[] = '........................';
      $name = true;
      return $array;
    }
    a volat to mam takto?
    $myVal = returnTwoValue($a, $b, &$name);
    díky
    24.3.2012 23:19 Kit
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Netvrdím, že to tak nejde, ale používám přehlednější řešení.
    24.3.2012 23:35 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Nedělal jsem testy, ale principiálně na toto list nemám rád a nerad vracím pole, používání volání odkazem a referencí je čisté řešení a paměťově/výkonově nenáročné.
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    24.3.2012 23:49 Kit
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Místo list() by asi byl vhodnější objekt. Volání odkazem a referencí nepovažuji za čisté řešení. Obě řešení budou podle mne paměťově/výkonově stejně náročná, protože dobrý překladač z toho vytvoří podobný kód.

    Přiznám se, že pole sice vracím velmi často, ale list() používám minimálně.
    24.3.2012 23:31 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Volat takto: $myVal = returnTwoValue($a, $b, $name);, váš zápis je pro staré PHP4.
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    25.3.2012 00:03 Dušan S.
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Tak jak to mám volat když potřebuji tu proměnnou $myVal naplnit polem z té volané funkce
    25.3.2012 00:10 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Bu halóóóóóó, nebo jak jsem Vám napsal, nebo nerozumím otázce - opravil/odstranil jsem Vám jen z volání fce &, který tam nepatří.
    Ale já bych to otočil, předával pole odkazem a stavovou proměnou vracel…
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    25.3.2012 00:14 Dušan S.
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Ale já bych to otočil, předával pole odkazem a stavovou proměnou vracel…
    Leč nevím absolutně jak..
    Bu halóóóóóó, nebo jak jsem Vám napsal, nebo nerozumím otázce - opravil/odstranil jsem Vám jen z volání fce &, který tam nepatří.
    Ale psal jste, že to je zastaralé řešení, tak se ptím jak je se to píše moderně ;)
    25.3.2012 00:17 Kit
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Ale psal jste, že to je zastaralé řešení, tak se ptím jak je se to píše moderně ;)
    Moderně se předává objekt. Úplně stejně jako primitvní datový typ.
    25.3.2012 00:28 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Tím bych teď tazatele nemátl, mimochodem ty se předávají odkazem by default (nebo respektive, předává se jejich identifikátor/ukazatel hodnotou).
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    25.3.2012 00:21 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Tady jsem ukázal jak - fce returnTwoValueRef().
    V PHP4 se při předávání odkazem & zapisoval i při volání, v PHP5 se uvádí jen v definici/deklaraci fce, při volání fce již ne.
    (A proto to někdo považuje za matoucí, protože se fce volá naprosto stejně a není poznat, která fce může měnit obsah předávaných proměnných, a která ne. --- Ale definice fce to jasně říká, takže to matoucí není :-) )
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    28.3.2012 14:42 jos
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    z dokumentace:

    As of PHP 5.3.0, you will get a warning saying that "call-time pass-by-reference" is deprecated when you use & in foo(&$a);.
    28.3.2012 14:45 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    A píšu něco jiného?
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    28.3.2012 16:56 jos
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    jo, píšeš

    V PHP4 se při předávání odkazem & zapisoval i při volání, v PHP5 se uvádí jen v definici/deklaraci fce, při volání fce již ne.

    takže v PHP5 call time pass by ref funguje, od 5.3 to hází warning
    28.3.2012 20:49 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Přečti si to pořádně, začíná to: „There is no reference sign on a function call - only on function definitions.“
    Pokud ovšem narážíš na verzi, tak je tam „As of“ což není „od“.
    A tento warning hážou všechny 5-kové, jestli si to dobře pamatuju.
    Důkaz:
    >php -r 'phpinfo();' | grep 'PHP Version' | head -n 1
    PHP Version => 5.2.14
    nebo na druhém stroji
    PHP Version => 5.3.3-7+squeeze8
    
    soubor kuk.php
    <?php
    function func(&$par){
      $par = 1;
    }
    $p = 0;
    echo "Before correct: ", $p, "\n";
    echo func($p);
    echo "After correct: ", $p, "\n";
    $p = 0;
    echo "Before incorrect: ", $p, "\n";
    echo func(&$p);// row: 11 
    echo "After incorrect: ", $p, "\n";
    
    Výstup php kuk.php (na obou strojích identický):
    PHP Warning:  Call-time pass-by-reference has been deprecated in /home/imega/kuk.php on line 11
    Before correct: 0
    After correct: 1
    Before incorrect: 0
    After incorrect: 1
    
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    29.3.2012 11:03 jos
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    ok, ale to že neumim excelentně anglicky nic nemění na tom, že to v < 5.4 pořád funguje (průvodní jevy neřešim)
    29.3.2012 14:25 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Na angličtinu se vy..er, tu větu jsem luštil sem a zpátky několikrát a nebude to asi věcí jazykových znalostí, spíš pochopení, co chtěl autor vyjádřit, bo to není napsané zrovna jasně a jednoznačně bez dalších znalostí….
    Ale nevím jestli si rozumíme my dva.
    Předání odkazem (reference) fungují ve verzi 4,5 a budou i fungovat nadále (myslím, nezaznamenal jsem žádný nápad o jejich odstranění), tedy následující kód v php4/php5 bude valit dále naprosto v pohodě.
    function func(&$par){
      $par = 1;
    }
    $p = 0;
    func($p);
    ...
    
    Jediný rozdíl je v tom, že v PHP 5 nelze při volání fce uvést &, a když se uvede a je povoleno zobrazovat chyby E_DEPRECATED tak to vyvolá warning na úrovni parseru (tedy je vidět ve stránce jen tehdy, je-li to povoleno v php.ini nebo .htaccess).
    Tedy tento kód v php5:
    func(&$p);
    
    vyvolá ten warning.

    PS: V PHP4 bylo možné předat funkci argument referencí při volání fce a to i když fce měla argument bez & - což bylo „divné“ a fčul to právě hází warning. Stejně tak se změnilo chování objektů, ty se při čemkoliv předávají automaticky referencí (a taky i třeba při přiřazení do jiné proměnné se & neuvádí), pokud chcete kopii instance třídy, musíte použít clone.
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    29.3.2012 16:52 jos
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    nerozumíme si, warning to vyvolá, vo tom žádná (to sou ty "průvodní jevy")

    mam tu 5.3.10 (na widlích) a kód:
    function fun($x)
    {
      $x++;
    }
    
    $y = 0;
    
    fun(&$y);
    var_dump($y);
    
    má výstup "int(1)"

    schválně si to zkus, jo a taky v textu toho warningu píšou, že nastavením allow_call_time_pass_reference na On ten warning zmizí a allow_call_time_pass_reference defaultuje na On
    29.3.2012 17:58 Kit
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    PHP 5.3.9:
    PHP Deprecated:  Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of fun().  If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in /home/vp/fun.php on line 9                                             
    int(1)
    
    To znamená, že to sice provede, ale má kolem toho hromadu keců, jak to má správně vypadat a jak se ten warning dá ignorovat nastavením v konfiguraci. A měly by to tak dělat všechny verze 5.x.x
    29.3.2012 18:58 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Ju. Bo chci mít někde poslední slovo (když ho doma nemám):
    Varování se liší dle toho, jestli je parametr i v definice funkce označen jako reference nebo ne.
    Pokud je, napíše to chybu, kterou jsem uváděl výše, pokud ne (,& je jen při volání fce,) napíše to chybu, ve které se píše to co zmiňuješ.
    Ad. allow_call_time_pass_reference její default hodnot je sice On, ale v případě PHP je spousta dalších nastavení defaultních hodnot, řekněme zpětně kompatibilní, ale prakticky nepoužitelné a jakýkoliv distribuční php.ini co jsem našel má allow_call_time_pass_reference = Off, však je to i doporučená hodnota pro jakékoliv určení…, že by v „Something similar to operating system“ byla tato hodnota v php.ini On, je divné - ale tam je možné všechno, jak dnes a denně zjišťuji :-)
    Nenapadla mě tato kombinace, bo když vím, že něco zastaralé, tak už to nepoužívám, od té doby co se o tom začne mluvit :-).
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    Josef Kufner avatar 30.3.2012 12:49 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Však ti právě tohle napsal. Si to přečti ještě jednou.

    A ten warning je přesný a jednoznačný. Říká, že '&' při volání funkce je deprecated, tak ho tam nepiš a dej ho do definice té funkce. Tedy přesuň ho z řádku 8 na řádek 1.
    Hello world ! Segmentation fault (core dumped)
    30.3.2012 14:50 jos
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    sám si to přečti, ve svým příkladu měl '&' v deklaraci funkce, já ho v příkladu mam jenom na callsite a funguje to, což je IMO v protikladu s výrokem "v PHP5 se uvádí jen v definici/deklaraci fce, při volání fce již ne" - nevim co tim myslel, já to každopádně pochopil jako že to vůbec nefunguje (což není pravda)

    přesouvat nic nepotřebuju, tohle je jen akademická diskuze; deprecated sraček se zbavujeme průběžně, přechod na PHP5 je už pár roků za náma
    30.3.2012 15:13 Kit
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Když '&' použiješ jen při volání, tak to sice funguje, ale vyhazuje to warningy. Pokud ti to žádné warningy nehlásí, máš tyto hlášky potlačeny v konfiguraci.

    Fungují všechny varianty s '&', ale jen jedna je považována za správnou. Ostatní vyhazují warningy, které zřejmě ignoruješ.

    Pokud nějaký příkaz vyhazuje warning, tak to znamená, že se provede. Hlášení je jen text navíc.
    30.3.2012 17:26 jos
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    kurva chlapi běžte už do prdele, šangala tvrdil (aspoň já to tak pochopil), že v PHP5 to (& jen na callsite) vůbec nefunguje; že sem to experimentálně vyvrátil neznamená že ve svým kódu ignoruju warningy, naopak máme v plánu nasadit vlastní errorhandlery který budou vrhat výjimky i na E_NOTICE (zatim jen E_RECOVERABLE_ERROR)

    část ostrý konfigurace: allow_call_time_pass_reference = Off error_reporting = -1 display_errors = Off log_errors = On log_errors_max_len = 0

    stačí to abyste si o mně nemysleli že sem úplnej trotl?
    30.3.2012 18:14 Kit
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Nestačí :-) Možná vnímám text trochu jinak, ale podle mne Šangala nic takového netvrdil. Myslíš tohle?
    Tedy tento kód v php5:
    func(&$p);
    vyvolá ten warning.
    Warning a deprecated jsou jen oznámení o něčem nevhodném, ale požadovaný úkon to provede.
    30.3.2012 18:26 jos
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    myslim tohle:

    V PHP4 se při předávání odkazem & zapisoval i při volání, v PHP5 se uvádí jen v definici/deklaraci fce, při volání fce již ne.

    co se děje při různejch chybách v PHP vim docela dobře, ale o tom tahle diskuze snad není
    30.3.2012 18:42 Kit
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    A kde je v tom napsáno, že "&" v PHP5 při volání funkce nefunguje? Uvedl, že se to tam už neuvádí, ale to ještě neznamená, že se to tam nesmí uvádět.
    31.3.2012 08:25 jos
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    někde nahoře píšu že sem tak šangalu pochopil, ale že to tak myslet nemusel

    ad "už neuvádí" - kdybych fakt moc chtěl selektivně (dle callsite) omasírovat třeba nějakej int, tak musim; a ani bych nemusel bejt takovej lamer kterej neví jak z toho vybruslit, třeba bych mohl používat nějakou knihovnu která už se nevyvíjí a nemam čas na to se v ní hrabat
    25.3.2012 00:15 Kit
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    V funkci napíšeš return $pole; Nemusíš předávat jen primitivní datové typy, můžeš i pole nebo objekt.
    24.3.2012 22:28 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Pole nebo dokazem:
    <?php
    /**
     * @return Array('var' => value, 'return' = return code) 
     */
    function getTwoVal(){
      return Array('var' => 'xy', 'return' => true);
    }
    /**
     * @param &$val - ref to value
     * @return boolean - true on success
     */
    function getVal(&$val){
      $val = 'xy';
      return true;
    }
    
    $a = getTwoVal();
    if($a['return'])
      echo 'getTwoVal: ',$a['var'],"<br \>\n";
    
    $val=NULL;
    if(getVal($val))
      echo 'getVal: ',$val,"<br \>\n";
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    24.3.2012 22:56 Kit
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    function dvepromenne() {
       return array('prvni','druha');
    }
    
    list($prvni,$druha)=dvepromenne();
    25.3.2012 00:31 Dušan S.
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Tady posílám jak to mám a co přesně potřebuji. Snad to bude lepší k pochopení ;)
         function kontrola_formu($kontrola, $pdo, &$val){
    	
              if(empty($_POST['jmeno']){
                   $kontrola[] = 'jmeno';
              }
    
              if(empty($_POST['prijmeni']){
                   $kontrola[] = 'prijmeni';
              }
    
              if(empty($_POST['adresa']){
                   $kontrola[] = 'adresa';
                   $val = true;
              }
    
              return $kontrola;
         }
    
         $kontrola = array();
    
         $test = kontrola_formu($kontrola, $pdo, $val);
    
         if(count($test) == 0){
              echo "Všechno je OK";
         }
    
         if($val === true){
         echo "Prom z funkce kontrola_formu() je TRUE";
         }
    Ale samozřejm ta poslední podmínka se nesplní, jelikož nevím jak to zapsat :-(
    25.3.2012 00:40 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Ten kód neprojde ani parser-em, nedostatek ')'…
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    25.3.2012 00:46 Dušan S.
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    na závorky já trpim, psal jem to z hlavy, jelikoz ta funkce je moc dlouha ale jako priklad to snad staci ..
    25.3.2012 01:33 Dušan S.
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    OPRAVA snad je to dobře..
    <?php
         function kontrola_formu($kontrola, $pdo, &$val){
    	
              if(empty($_POST['jmeno'])){
                   $kontrola[] = 'jmeno';
              }
    
              if(empty($_POST['prijmeni'])){
                   $kontrola[] = 'prijmeni';
              }
    
              if(empty($_POST['adresa'])){
                   $kontrola[] = 'adresa';
                   $val = true;
              }
    
              return $kontrola;
         }
    
         $kontrola = array();
    
         $test = kontrola_formu($kontrola, $pdo, $val);
    
         if(count($test) == 0){
              echo "Všechno je OK";
         }
    
         if($val === true){
         echo "Prom z funkce kontrola_formu() je TRUE";
         }
    ?>
    25.3.2012 17:04 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    „Snad“? - to je tak těžké si to zkusit v terminálu? (…krom neexistence $pdo syntaxe je ok…)
    Mám problém tu fci pochopit, ale vypíše „Prom z funkce kontrola_formu() je TRUE“, což odpovídá tomu, že proměnnou $val jste předal odkazem a ona se Vám naplnila true (jinak by byla NULL), takže jak zněla otázka?
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    27.3.2012 17:31 Kit
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Nedalo mi to a trochu jsem ten příklad upravil:
    <?php
    function kontrola_formu($post){
       $kontrola = array();
       if(!isset($post['jmeno']))    $kontrola[] = 'jmeno';
       if(!isset($post['prijmeni'])) $kontrola[] = 'prijmeni';
       if(!isset($post['adresa']))   $kontrola[] = 'adresa';
       if(count($kontrola) != 0) throw new Exception('Chybí údaje: '.implode(', ',$kontrola));
       return array($post['jmeno'],$post['prijmeni'],$post['adresa']);
    }
    
    try{
       $data=kontrola_formu($_POST);
       echo "Prom z funkce kontrola_formu() je TRUE";
    } catch(Exception $e){
       echo $e->getMessage();
    }
    ?>
    Ovšem normálně bych tam to pole vůbec nedával a vyhodil výjimku po prvním výskytu chyby. Pokud by někdo potřeboval vypsat všechna chybějící políčka formuláře zároveň, tak bych to svěřil Javascriptu. Kontrolu v PHP bych samozřejmě nechal, aby zachytávala i ty chyby, které by se klient snažil obejít.

    Jak je vidět, bohatě stačí návrat ošetřených dat z funkce. Chyby se dají hlásit přes výjimky.
    27.3.2012 20:54 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    No spousta lidí by z toho asi nebyla šťastná, takto mně to přijde jako naprosto čisté „control flow“ výjimkami (dopředu jasně víme, že to pole může být neprázdné a to za standardní situace).

    Java efektivně Rada 39, našel jsem i elektronicky
    Zásady pro práci s výjimkami
    … a spoustu dalších…
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    27.3.2012 21:35 Kit
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Tohle není „control flow“. Podívej se pořádně. Pokud uživatel řádně vyplní všechny kolonky formuláře, k výjimce nedojde.

    Pole může být neprázdné pouze za nestandardní situace, kdy uživatel obešel javascriptovou kontrolu neprázdnosti polí v prohlížeči a vnutil mi neúplná data.
    27.3.2012 22:07 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    No jak myslíš, hádat se nebudu :-) (podle mě jsou to prostě jen nevyplněná vstupní data a provádí se jejich validace…)
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    27.3.2012 22:40 Kit
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Jistě, je to věcí názoru. Podle mne si chyba uživatelského vstupu zaslouží stejné ošetření, jako chyba vzniklá selháním HW, selháním SQL dotazu, dělením nulou nebo kdoví čím ještě. Nepoužívám výjimky k ukončení cyklu nebo k dalším zvěrstvům.

    Když už jsem se začetl do odkazovaného materiálu, tak jsem tam našel:
    výjimky kontrolované – chyby prostředí
    • chyby I/O, vstup uživatele, konfigurace
    • alternativní návratové kódy
    Řada expertů je dnes považuje za omyl a doporučují vyhazovat pouze nekontrolované výjimky a kontrolované převádět na nekontrolované.
    Řada expertů také doporučuje používání primitivních setterů a getterů místo daleko výhodnější business logiky v objektu. To si prostě nevybereš.
    pavlix avatar 25.3.2012 11:20 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Vím, že to asi nepomůže, za což se omlouvám. Ale není pak lepší, když už člověk stejně používá dynamicky typovaný jazyk, vzít nějaký, který tyhle věci umí „normálně“ (tedy napíšu, co chci a on už si to přeloží podle potřeby)?
    def abc():
        return 1, 2
    
    a, b = abc()
    
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    25.3.2012 11:51 Kit
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    PHP to zvládá podobně. Použití pole místo seznamu je sice trochu kostrbatější, ale překousnout se to snad dá:
    function abc(){
       return array(1,2);
    }
    
    list($a,$b)=abc();
    Pokud však vezmu příklad tazatele, asi bych dekompozici uvedeného problému provedl úplně jinak a tato potřeba by mi vůbec nevznikla.
    pavlix avatar 25.3.2012 16:56 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    PHP to zvládá podobně. Použití pole místo seznamu je sice trochu kostrbatější, ale překousnout se to snad dá:
    V tom případě bych se s tím vůbec nesral, a použil bych tuto, byť neskutečně ošklivou, syntaxi PHP.
    Pokud však vezmu příklad tazatele, asi bych dekompozici uvedeného problému provedl úplně jinak a tato potřeba by mi vůbec nevznikla.
    Chápu.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    25.3.2012 17:18 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Přesně tak, nesmírně ošklivý konstrukt :-), mám potřebu vysvětli svůj negativní postoj k takovým věcem (jak k list, tak vracení pole).
    Takže důvod je ten, že se vrací hodnotou a ta hodnota se kopíruje, i když orginál není už třeba, proto mi v takových případech přijde správné připravit „proměnnou“ (zde tedy pole) a předat na něj jen ukazatel (jinak php umí i vracet referenci z fce).
    Jo to debata asi o ho..ě, protože ve skutečnosti engine si s tím poradí a tyto operace pravděpodobně neprovádí v rámci svého memory managment-u.
    No a z list je to to samé, to co jsem mohl připravit přímo „kontejneruju“ a „dekontejneruju“ (vlastně se zbytečně provádí serializace).
    OT: Pokud by se jednalo o objekt, tak ten je v pohodě bo tam se předává referencí by default (jeho identifikátor hodnotou, což je integer).
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    pavlix avatar 25.3.2012 17:44 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Přesně tak, nesmírně ošklivý konstrukt :-), mám potřebu vysvětli svůj negativní postoj k takovým věcem (jak k list, tak vracení pole). Takže důvod je ten, že se vrací hodnotou a ta hodnota se kopíruje, i když orginál není už třeba, proto mi v takových případech přijde správné připravit „proměnnou“ (zde tedy pole) a předat na něj jen ukazatel (jinak php umí i vracet referenci z fce).
    Popravdě řečeno, v PHP jsem nedělal od dob PHP4. Ale prakticky všechny ostatní dynamicky typované jazyky, co znám, používají přiřazení k pojmenování existujího objektu a ne kopírování.

    Nicméně, jde to otestovat:
    #!/usr/bin/php
    <?php
    $a = array();
    $a["asdf"] = "asdf";
    $b = $a;
    var_dump($a);
    var_dump($b);
    ?>
    
    Takže ti musím dát za pravdu, že PHP pole kopíruje. A jestli máš pravdu i v tom, že jiné typy objektů nekopíruje, tak se jenom utvrzuju v tom, že je ten jazyk nedobře navržený, když různé druhy strukturovaných objektů mají různý význam při přiřazení.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    25.3.2012 18:17 Kit
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Ano, v případě přiřazení se provádí deep copy. Ovšem to není případ příkazu return. Nevzpomínám si, kdy jsem naposledy potřeboval udělat mělkou kopii. PHP ji samozřejmě také umí. Uvedený test nic nedokazuje.

    Použití pole předaného odkazem má ještě jednu nepříjemnou vlastnost: Výsledek se nedá přímo vložit jako parametr další funkce. Zbytečně se deklaruje další proměnná na úrovni volajícího modulu, což představuje zbytečnou paměťovou zátěž navíc.
    25.3.2012 18:50 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    A jestli máš pravdu i v tom, že jiné typy objektů nekopíruje, tak se jenom utvrzuju v tom, že je ten jazyk nedobře navržený.
    Tak bych to neviděl, ono je to docela přirozené, předávat základní built-in typy hodnotou a objekty (instance tříd) referencí, koneckonců dělá to tak spousta „lepších“ jazyků (C#, Java…).
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    Aleš Janda avatar 27.3.2012 23:44 Aleš Janda | skóre: 23 | blog: kýblův blog | Praha
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Takže ti musím dát za pravdu, že PHP pole kopíruje.

    Ne, nekopíruje. PHP používá copy-on-write, tedy dokud jedné z proměnných nic nezapíšeš, ukazují obě do stejného místa v paměti. Resp. je jedno, jak velké pole budeš kopírovat, bude to pořád stejně rychlé, protože se kopíruje jen odkaz, i když to není vidět a tváří se to jako hluboká kopie.

    Podle mě je toto ideální chování, které mi naopak chybí v mnoha jiných jazycích.
    25.3.2012 18:03 Kit
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Příkaz return v PHP vrací jen ukazatel na pole, řetězec či objekt, ke kopírování nedochází. V podstatě se to chová stejně, jako kdyby funkce měla další parametr předaný odkazem.

    Dokonce předání dlouhého stringu přes return je asi 2x rychlejší, než předání odkazem. Nevidím důvod, proč bych měl prznit své funkcionální návyky kvůli domnělé úspoře výkonu.

    list() skutečně vypadá hnusně, ale v některých případech je užitečný. Ovšem pro původní příklad se to nehodí, protože je IMHO celý špatně.
    25.3.2012 18:59 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Příkaz return v PHP vrací jen ukazatel na pole, řetězec či objekt, ke kopírování nedochází.
    …člověk se dozvídá furt něco nového…

    Původní dotaz nebo „problém“ , vlastně nevím kde je, protože je to pro mě jak když mám něco dělat na kalkulačce kde mám GOTO, LABEL a GOSUB…
    Ale jestli je účelem té fce to co bylo ukázáno, tedy kontrola vstupních POST dat, tak jak to tam je, tak musí poradit někdo jiný, já přemýšlím jinak… :-)
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    25.3.2012 19:08 Kit
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    Původní dotaz byl už dávno zodpovězen, nyní už jen diskutujeme nad různými variantami a vlivu na výkon.
    30.3.2012 05:06 blizzz | blog: Filmy
    Rozbalit Rozbalit vše Re: Jak můžu vrátit funkcí 2 proměnné
    v inych jazykoch sa to riesi pomocou tuple ktore dokaze do jednej premnenej zabalit viac premennych:
    let prehod a b = b, a
    
    let a, b = prehod "a" "b"
    v PHP sa tuple nahradza polom:
    function prehod($a, $b)
    {
        return array($b, $a);
    }
    
    list($a, $b) = prehod("a", "b");

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.