Portál AbcLinuxu, 12. května 2025 05:40
Řešení dotazu:
&&;$cislo
function returnTwoValue(){ $array = array(); $array[] = '............'; $array[] = '........................'; $name = true; return $array; }Dík
<?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);
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
$myVal = returnTwoValue($a, $b, $name);
, váš zápis je pro staré PHP4.
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ě ;)
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.
returnTwoValueRef()
.>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+squeeze8soubor
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
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).func(&$p);vyvolá ten warning.
clone
.
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
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
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 Tedy tento kód v php5:Warning a deprecated jsou jen oznámení o něčem nevhodném, ale požadovaný úkon to provede.func(&$p);vyvolá ten warning.
return $pole;
Nemusíš předávat jen primitivní datové typy, můžeš i pole nebo objekt.
<?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";
function dvepromenne() { return array('prvni','druha'); } list($prvni,$druha)=dvepromenne();
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 <?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"; } ?>
true
(jinak by byla NULL), takže jak zněla otázka?
<?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.
výjimky kontrolované – chyby prostředíŘ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š.Řada expertů je dnes považuje za omyl a doporučují vyhazovat pouze nekontrolované výjimky a kontrolované převádět na nekontrolované.
- chyby I/O, vstup uživatele, konfigurace
- alternativní návratové kódy
def abc(): return 1, 2 a, b = abc()
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.
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.
Přesně tak, nesmírně ošklivý konstruktPopravdě ř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:, 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).
#!/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í.
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…).
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…
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");
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.