Autor Zpráva
Tatarka
Profil *
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
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 *
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
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 *
Dík za vysvětlení. Ty reference jsou celkem složité na pochopení, šlo by to napsat ještě jinak bez nich?
Alphard
Profil
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é.

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: