Autor | Zpráva | ||
---|---|---|---|
Tatarka Profil * |
#1 · Zasláno: 21. 8. 2014, 21:32:51
Ahoj
snažím se pochopit třídu flash message ze sekce sessions na pehapko.cz což je todle http://pehapko.cz/programujeme-v-php/sessions Docela to chápu ale čemu nerozumím jsou ty ampersandy, vím, že to jsou reference ale jednou přes konstruktor a pak ještě na &$s['messages'] , proč je to tam 2x? Jak pro blbečka, uplně polopaticky, někdy hůř chápu - děkuju moc |
||
Jan Tvrdík Profil |
#2 · Zasláno: 21. 8. 2014, 21:49:00
Tatarka:
Protože při předání parametrů nebo přiřazení proměnné normálně dochází ke kopii*. Ampersand v obou případech té kopii zabrání. Takže předám-li do konstruktoru $_SESSION , tak se vlastnost Message::$storage stává aliasem k proměnné $_SESSION , takže když zapíšu do Message::$storage , tak je to stejné, jako kdybych zapsal přímo to $_SESSION .
*Interní chování PHP bych do toho nemotal, už proto, že se v PHP 7 částečně mění. |
||
Tatarka Profil * |
#3 · Zasláno: 21. 8. 2014, 22:01:03
Díky Jane Tvrdíku, to co jsi napsal to dává smysl, ale kdyz mame toto
public function __construct(&$s) { if (!isset($s['messages'])) { $s['messages'] = []; } $this->storage = &$s['messages']; } tak by snad stacil ten ampersand jen v konstruktoru ne? Uz tim se rekne ze to je reference a potom tady $this->storage = &$s['messages']; by měl stačit už bez ampersandu? Ty reference jsou takovy divoky :// |
||
Joker Profil |
#4 · Zasláno: 21. 8. 2014, 22:02:40
Tatarka:
Tip: Nadpisy na Péhápku jsou zároveň kotvy, pro lepší orientaci lze odkazovat přímo na „problémovou“ část stránky. Stačí najet myší na nadpis a kliknout na šipku, která se před ním objeví. „proč je to tam 2x?“ Protože to jsou dvě různé reference. Konstruktoru se předává reference na session nebo jiné úložiště pojmenované $s a třída si pak uloží referenci na jeden konkrétní prvek v poli, $s["messages"]. |
||
Jan Tvrdík Profil |
Joker:
„Protože to jsou dvě různé reference“ To sice jo, ale ty reference by byli potřeba i v případě, že by obě směřovali přímo na $_SESSION . Viz např.
$a = 7; $b = &$a; // tady nedojde ke kopii $c = $b; // tady dojde ke kopii $a = 3; var_dump($a, $b, $c); // 3 3 7 Reference v PHP se dost liší od referencí třeba v C. |
||
Tatarka Profil * |
#6 · Zasláno: 22. 8. 2014, 09:29:59
Dík za vysvětlení. Ty reference jsou celkem složité na pochopení, šlo by to napsat ještě jinak bez nich?
|
||
Alphard Profil |
#7 · Zasláno: 22. 8. 2014, 20:25:31
Tatarka [#6]:
Jak je napsáno v článku, šlo by přistupovat přímo k $_SESSION, je to superglobální proměnná, to by ale zavedlo ošklivou závislost. V tomto případě se spíš nabízí nahradit klasické pole instancí nějaké třídy zapouzdřující session. Pak odpadne starost s ručním referencováním, protože při předávání instancí je to automatické. |
||
Časová prodleva: 10 let
|
0