abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 21:21 | Nová verze Ladislav Hagara | Komentářů: 0
dnes 11:44 | Zajímavý projekt

Na Indiegogo byla spuštěna kampaň na podporu herní mini konzole a multimediálního centra RetroEngine Sigma od Doyodo. Předobjednat ji lze již od 49 dolarů. Požadovaná částka 20 000 dolarů byla překonána již 6 krát. Majitelé mini konzole si budou moci zahrát hry pro Atari VCS 2600, Sega Genesis nebo NES. Předinstalováno bude multimediální centrum Kodi.

Ladislav Hagara | Komentářů: 0
dnes 00:10 | Nová verze

Byla vydána verze 4.7 redakčního systému WordPress. Kódové označením Vaughan bylo vybráno na počest americké jazzové zpěvačky Sarah "Sassy" Vaughan. Z novinek lze zmínit například novou výchozí šablonu Twenty Seventeen, náhledy pdf souborů nebo WordPress REST API.

Ladislav Hagara | Komentářů: 0
včera 12:00 | Zajímavý projekt

Projekt Termbox umožňuje vyzkoušet si linuxové distribuce Ubuntu, Debian, Fedora, CentOS a Arch Linux ve webovém prohlížeči. Řešení je postaveno na projektu HyperContainer. Podrobnosti v často kladených dotazech (FAQ). Zdrojové kódy jsou k dispozici na GitHubu [reddit].

Ladislav Hagara | Komentářů: 24
včera 11:00 | Bezpečnostní upozornění

Byly zveřejněny informace o bezpečnostní chybě CVE-2016-8655 v Linuxu zneužitelné k lokální eskalaci práv. Chyba se dostala do linuxového jádra v srpnu 2011. V upstreamu byla opravena minulý týden [Hacker News].

Ladislav Hagara | Komentářů: 2
5.12. 22:00 | Komunita

Přibližně před měsícem bylo oznámeno, že linuxová distribuce SUSE Linux Enterprise Server (SLES) běží nově také Raspberry Pi 3 (dokumentace). Obraz verze 12 SP2 pro Raspberry Pi 3 je ke stažení zdarma. Pro registrované jsou po dobu jednoho roku zdarma také aktualizace. Dnes bylo oznámeno, že pro Raspberry Pi 3 je k dispozici také nové openSUSE Leap 42.2 (zprávička). K dispozici je hned několik obrazů.

Ladislav Hagara | Komentářů: 6
5.12. 06:00 | Zajímavý software

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 50
5.12. 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 10
3.12. 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 17
3.12. 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (23%)
 (29%)
 (8%)
 (5%)
 (3%)
Celkem 783 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

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: 1435×
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: 58 | 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: 66
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: 53 | 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()
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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í.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 21 | blog: kýblův blog | Kralupy nad Vltavou
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.