Portál AbcLinuxu, 14. listopadu 2025 23:05
Ř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 
.
Možná vnímám text trochu jinak, ale podle mne Šangala nic takového netvrdil. Myslíš tohle?
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.
(podle mě jsou to prostě jen nevyplněná vstupní data a provádí se jejich validace…)
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.
, mám potřebu vysvětli svůj negativní postoj k takovým věcem (jak k list, tak vracení pole).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.