Autor Zpráva
fleury16
Profil
Zdravím,
mám proměnou $x = true; a funkci:
prepis($promena){
if($a != 10){
$promena = false;
}
}

pak ji volám:
prepis($x);

a pak vypíšu proměnou $x tak mě vrátí true(1) jaktože nevypíše false(0), samozřejmě předpokládáme že $a není 10!
Alphard
Profil
Zdá se mi, že ignorujete rozdíl mezi globálními a lokálními proměnnými. Ideálně si projděte manuál.
Jinak si nastudujte uživatelsky definované funkce. Stručně jde o to, že proměnné se funkci předávají v parametru a navrací se pomocí return. Je-li to vhodné, lze použít tzv. reference (nebo definovat proměnnou jako globální, ale to obvykle není rozumné).
Fisak
Profil *
doporučuji si prostudovat objektování to by si myslím v téhle věci pomohli... jinak se to dá řešit dalšími dvěmi způsoby... define($x, true); a nebo již zmíněným global... ale to moc nedoporučuji.. nejideálnější řešení je obejktování :-)
fleury16
Profil
takže stačí před $promena = false; napsat global $promena ?
Alphard
Profil
[#4] fleury16
To je přesně to řešení, které se nabízí a které je nejméně vhodné...
Ale pokud (zatím) nevidíte, v čem mohou být problémy, udělejte to tak.
fleury16
Profil
zkoušel jsem to ale nepřepíše se to! :(


$a = 10;
$b = "ano";

 function a($c){
  if($a = 10){
    global $c;
    $c = "ne";
  }
}

 a($b);

 echo $b;


pořádn vypisuje ano!
Alphard
Profil
Tak ono je taky potřeba přemýšlet o tom, jak program probíhá a co má v daném kontextu k dispozici.
Kromě toho, že proměnná $a uvnitř funkce neexistuje (protože [#2]), měníte $c a vypisujete $b.

Dodávám, že si sám nejsem jist stavem, kdy je $c zároveň parametr a globální proměnná.
Mastodont
Profil
Global musíš použít na $a, ne $c, to předáváš jako parametr. Aby bylo možné změnit $c, stačí z něj udělat parametr předávaný odkazem, ne hodnotou. A porovnává se dvěma nebo třemi "=", ne jedním.
$a = 10; 
$b = "ano"; 

    function a(&$c){ 
  global $a;  
  if($a == 10){ 
    $c = "ne"; 
  } 
} 
 
    a($b); 
 
    echo $b;
fleury16
Profil
Jo díky moc už to funguje, takže jestli tomu chápu tak parametr předávaný hodnotou se vloží do lokální proměné uvnitř funkce a tudíž nemá vliv na tu globální a při předání parametru odkazem se pracuje přímo jakoby s tou globální proměnou co?
Mastodont
Profil
Ano.
PHP_Nemaster
Profil
A jak by to bylo v objektech?
Nox
Profil
Stejně, ale beztak ty kódy co tu jsou jsou šílené (vím že Mastodont se prostě snažil odpovědět, to je ok) a nemělo by se to takto používat ... global, reference (zde), dvě magické konstanty, šílené identifikátory ... to je sbírka...
Mastodont
Profil
Nox:
Co přesně je špatně na ByRef parametrech? Viz třeba preg_match_all :-)
Nox
Profil
Vyloženě špatné ne, v PHP mi to ale přijde docela nestandardní ... jako optimalizaci asi jo, pro nějaké velké pole nebo tak...

S referencí např. nejde přímo výsledek přiřadit jiné proměnné, modifikuje to původní, takže se to stejně musí nějak kopírovat a je to prostě divné

Třeba u preg_* funkcí mě ty reference poměrně vytáčí...
YoSarin
Profil
Mastodont:
Zrovna teď my byref parametr u foreache připravil pěkně hnusnou chvilku:
foreach ($array as $id => &$row) {
    $row[0] = 'něco děsně důležitého';
}
...
// spousta kódu
...
if ($etwas) {
    $row = true;
}
...
// další spousta kódu
...
print_r($array);
// a poslední položka z pole $array má hodnotu true. Jupí!

Jasně, netýká se to byref parametrů u funkcí, ale stejně to nemile překvapilo a hledal jsem příčinu celkem dlouho... :-)
Mastodont
Profil
Nox:
Bývalo to zcela běžné, například Win 32 API je plné funkcí, jejichž návratová hodnota říká jen to, zda volání funkce skončilo úspěchem či ne. Taky to umožňuje vrátit z funkce víc hodnot, když člověk nechce použít pole nebo datový objekt.

Nijak to nepropaguju, je to prostě nástroj, který se někdy hodí.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0