Autor | Zpráva | ||
---|---|---|---|
fleury16 Profil |
#1 · Zasláno: 26. 12. 2011, 23:37:50 · Upravil/a: fleury16
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 |
#2 · Zasláno: 26. 12. 2011, 23:45:15
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 * |
#3 · Zasláno: 26. 12. 2011, 23:59:52
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 |
#4 · Zasláno: 27. 12. 2011, 00:18:06
takže stačí před $promena = false; napsat global $promena ?
|
||
Alphard Profil |
#5 · Zasláno: 27. 12. 2011, 00:20:04
[#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 |
#6 · Zasláno: 27. 12. 2011, 00:26:30 · Upravil/a: fleury16
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 |
#8 · Zasláno: 27. 12. 2011, 08:09:35 · Upravil/a: Mastodont
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 |
#9 · Zasláno: 27. 12. 2011, 10:08:39
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 |
#10 · Zasláno: 27. 12. 2011, 10:10:11
Ano.
|
||
PHP_Nemaster Profil |
#11 · Zasláno: 27. 12. 2011, 11:12:00
A jak by to bylo v objektech?
|
||
Nox Profil |
#12 · Zasláno: 27. 12. 2011, 11:21:18
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 |
#13 · Zasláno: 27. 12. 2011, 12:18:08
Nox:
Co přesně je špatně na ByRef parametrech? Viz třeba preg_match_all :-) |
||
Nox Profil |
#14 · Zasláno: 27. 12. 2011, 12:32:53
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 |
#15 · Zasláno: 27. 12. 2011, 12:35:34
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 |
#16 · Zasláno: 27. 12. 2011, 12:58:58
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í. |
||
Časová prodleva: 12 let
|
0