PHP hádanka IV.
Minule jsem sliboval, že dnes bude něco těžšího. A taky že jo!
I když se to zdá na první pohled jasné, zdání může klamat. Tak tedy,
jakou hodnotu bude mít na konci skriptu proměnná $foo
?
function setFoo(&$value) {
global $foo;
$foo = & $value;
}
$foo = 123;
$bar = 777;
setFoo($bar);
echo $foo;
Komentáře
Mormegil #1
Sakra, já teda do PHP nevidím a vidět nechci, ale je nějaký rozumný důvod, proč by to nemělo vypsat 777?
Thom #2
No, rozumný dôvod …
Vyskúšané: vypíše to `123 `.
johno #3
#2 Thome, Ja nechápem ľudí čo to spustia a napíšu sem výsledok. Odskúšať si to vie hádam každý sám nie?
Ja som bol tiež presvedčený, že to bude 777.
David Grudl #4
nápověda: je dobré vědět, že
global $foo;
je ekvivalentní s$foo = & $GLOBALS['foo'];
martinpav #5
No pokial to dobre chapem tak :
global $foo; – obsahuje referenciu na premennu $foo
$foo = & $value; – priradi sa referencia na premennu $value ⇒ akakolvek priradena hodnota sa priradi premennej $value
Ale je mozno ze trepem bludy, tak to potom radsej zmaz :).
Mormegil #6
#4 Davide Grudle, Ano, to je důvod. Za rozumný bych ho ale rozhodně neoznačil, spíš za důkaz, že PHP je zbastlenina jaksepatří. 😉 (Ale faktem je, že ten ampersand v přiřazení tam poněkud smrdí.)
David Grudl #7
#6 Mormegile, je to spíš problém všeobecné neznalosti toho, co jsou reference. Za to PHP nemůže. Zrovna včera jsem něco hledal v manuálu a narazil na tuto stránku What References Are Not, kde je zlehka podobný příklad.
Mormegil #8
#7 Davide Grudle, Já se nehádám (už jsem konstatoval, že do PHP nevidím (a vidět nechci)); tou prasárnou jsem neměl na mysli chování referencí, ale fakt, že „globální proměnné“ jsou ve skutečnosti reference na globální proměnné. Howgh.
David Grudl #9
#8 Mormegile, taky se nehádám 😉
Ale kdy určité chování nazývat prasárnou, a kdy feature? V tomto případě jde o dobře zdokumentovanou záležitost, zkušeným péhápéčkařům jistě známou, tedy nic špatného v tom nevidím.
global
prostě tvoří reference, přímý přístup lze realizovat pomocí pole$GLOBALS
Srovnejte:
Prochaine #10
Proč ve všech podobných hádankách hraje roli reference (&), bez kterých jsem se v PHP dobré 4 roky obešel?
Adam Hošek #11
#10 Prochaine, Možná proto, že v jiných oblastech není z čeho dělat hádanky :). I když na druhou stranu třeba na dagblogu vychází i jiné úkoly… vymyslet třeba algoritmus s nejmenším počtem příkazů… Sice je to zpravidla javovsky orientované, ale stejné problémy lze zpravidla řešit i v PHP.
David Grudl #12
#10 Prochaine, Už jsem si to taky říkal 🙂 Snažím se postupovat „didakticky“, zatím se vyhýbám funkcím, v hlavní roli jen čistý jazyk. I ten skýtá dost tajemných zákoutí.
Ale na příště už mám připravenou hádanku bez jakýchkoliv referencí!
Petr #13
A kdy bude rozřešení??? Docela by mě zajímalo, protože mě zde jaksi uniká smysl…
Petr #14
Mohl byste mi prosím někdo vysvětlit, proč mi nefunguje následující kód:
proměná $cache1 je cookies, takto jsem jich měl uložených 35 a potřeboval je naskládat do výsledku.
Petr #15
#14 Petře, mělo tam být jen jedno lomítko
David Grudl #16
#14 Petře, vůbec nechápu, proč tam používáte to lomítko?
jinak zkuste
$vysledek .= ${"cache$x"};
Adam Hošek #17
#16 Davide Grudle, #14 Petr Nebylo by mnohem jednodušší to naskládat do pole a pak s ním pracovat? :))). Trošku mi to připomíná takové ty příklady použití vykonstruované na nějakou vlastnost jazyka, přičemž se takové úlohy řeší běžně zcela jinak :)).
johno #18
#7 Davide Grudle, Tak mi to nedalo a pozrel som do manuálu. Konkrétne na pasáž v What References Do a v nej je ako prvý warning vysvetlené správanie presne tohto príkladu.
Finta je presne v tom ako si písal.
global $var;
totiž nesprístupní globálnu premennú, ale vytvorí lokálnu premennú rovnakého názvu, ktorá obsahuje referenciu na danú globálnu premennú.Pokiaľ by sme chceli zapisovať do tejto premennej tak sa mení obsah globálnej premennej – to je jasné. Ak však priradíme tejto lokálnej premennej refenciu na inú premennú tak vlastne zrušíme väzbu na globálnu premennú.
Mormegil #19
#9 Davide Grudle, Jistěže to je feature, navíc dokumentovaná. Ale jakou výhodu mi ta konstrukce poskytuje? Možnost v druhé půlce funkce používat stejný název globální proměnné pro něco úplně jiného než v půlce první? A opravdu to je něco, co chci? TO je to, proč říkám, že to je prasárna, prostě se vymyslel nějaký obskurní způsob, jakým dosáhnout něčeho, co se po většinu času chová tak, jak očekávám po zkušenostech odjinud. Asi jako další způsoby, jak do jazyka dostat něco, co tam není.
Ale nic ve zlém, PHP, na mých pár jednoduchých skriptů tě taky používám. 🙂
Squad_leader #20
#18 johno, Přiznám se toto jsem nevěl. Už vím proč jsem u jednoho programu vybuchl a stahl se na ústup.
Arthur Dent #21
#14 Petře, Pro inspiraci:
$x=1;
$promenna='cache'.$x;
$vysledek=$$promenna;
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.