Foreach, osztályok, publikus adattagok
Adott egy egyszerű osztály:Ha simán példányosítom akkor működik ahogy kell, tehát $instance->short -on keresztül elérem az adatot.
A gondom azzal van ha párat bepakolok egy session tömbbe:A későbbiekben szeretnék végig menni a tömbön, és a publikus tagokat elérni:Üres stringeket ír ki. Ha megnézem a cikluson belül $person-t var_dumppal, akkor látszik hogy benne van az adat, de nem tudom elérni.
Mitől lehet ez?
■
class cPerson {
public $first;
public $last;
function __construct($first,$last) {
$this->first=$first;
$this->last=$last;
}
}
A gondom azzal van ha párat bepakolok egy session tömbbe:
$_SESSION['persons'][]=new cPerson('valami','név');
$_SESSION['persons'][]=new cPerson('másik','név');
foreach($_SESSION['persons'] as $person) {
echo $person->first . ' ' . $person->last . '<br />';
}
Mitől lehet ez?
Nem osztaly
Notice van, sima változókkal
Így már működik is, csak a fejem felett világít egy hatalmas kérdőjel.
Nem értem ezen mit kell
Én sem ismerem a belső
Ha látja az osztálystruktúrát, márpedig a var_dumpban, helyesen van minden, akkor miért __PHP_Incomplete_Class, $_SESSION['x']=new myClass('helló'); esetében, és miért van rendben $x=new myClass('helló'); esetében.
Ha valaki megvilágítaná, válasszal, linkkel, megköszönöm.
Legyen
A harmadik sor fatal errort dob, mert az include még nem futott le, a PHP nem tudja mi az a B osztály.
A session_start() valami olyasmit csinál, hogy megkeresi az adott munkamenet adatait (valahol), és lefuttat egy unserialize() szerű dolgot. Mivel nem találja a B osztályt (mert még nincs), ezért menti a menthetőt ezzel az incomplete class módszerrel. Nem tudom hogyan tárolja szerializáltan az adatokat a php, de ezek szerint tudja hol van az eleje, a vége az objektumnak, sőt az egyes adattagok neveit is fölismeri.
A B osztály definíciója azért kéne, hogy tudja mit csináljon (mit hívjon meg), ha egy metódust meg akarsz hívni.
Ha a B osztály csak később lesz látható a php számára, akkor ő azzal már nem tud mit kezdeni, nem fogja hirtelen felismerni, hogy hoppá ez itt egy B típusú objektum volt, neki az már incomplete class marad.
Példányosítás természetesen
Mert a session_start()
Amit te szeretnél, az a lazy initialization, azaz hogy a PHP ne dolgozzon előre, csak "ha épp szükség van rá". Na ilyet nem tud a beépített munkamenet-kezelő.
Kösz a válaszokat! Most is
"Nem tudom hogyan tárolja
Így:
(Ezeket a c-vel prefixelt osztályneveket egyébként jelölni kéne valami "worst abuse of Hungarian notation" díjra.)
Kösz a további
"Ezeket a c-vel prefixelt osztályneveket egyébként jelölni kéne valami "worst abuse of Hungarian notation" díjra."
Soha nem használtam "Hungarian notation"-t, bár már találkoztam vele. Tehát a "c" prefix nem az említett jelölésrendszer helytelen használata (vagy öntrövényű kibővítése), hanem a saját jelölésrendszerem (ami lehet hogy kívülről nem szimpatikus, de nekem megszokott, és kényelmes) része, csak úgy mint az "o" példányosított elemek esetén.
A fentiek ellenére, ha linkelsz valami jelölésrendszert ami szerinted jó, és ami nem típusok, hanem programozási eszközök szerint jelöl, akkor annak örülnék.
Nyilván az a fontos, hogy
A magyar jelölésről és annak kisiklásáról egyébként Joelnek van egy jó cikke.