PHP 4 bug (?)
Több napot szenvedtem, mire kiderült, hogy a lenti bug található a PHP-ben. Eddig minden verzióban hibás volt. (Csak 4-eseket próbáltam.)
Ha egy osztály elemváltozója is osztály, és ez utóbbi műveletét használod, akkor referenciaváltozóvá válik ...
Kissé tanácstalan vagyok. Ha valakinek lenne ötlete, hogy hogyan lehet áthidalni, azaz hogyan tudnám a PHP-t megbízhatóan összetett struktúrák elkészítésére használni, azt megköszönném.
Ha valaki azt el tudná mondani, hogy mi lehet a bug oka, az is jól jönne. Ugyanis nem tudom, hol ütheti még fel a fejét ... ? (Vagy én értelmezek félre vagy rontok el valamit?)
De ha bárki, bármi bíztatót tud szólni, már az is elég lenne! Több hónapos fejelsztés eredményeként állt elő egy ennyire összetett kód. ... Most dobjam ki? (Netán javaslat, megbízható objektum orientált plattformra?)
No, azt hiszem ennyi. Ha valaki még előtte áll egy ilyennek, ne ágyazzon egymásba objektumokat.
:-(
■ Ha egy osztály elemváltozója is osztály, és ez utóbbi műveletét használod, akkor referenciaváltozóvá válik ...
Kissé tanácstalan vagyok. Ha valakinek lenne ötlete, hogy hogyan lehet áthidalni, azaz hogyan tudnám a PHP-t megbízhatóan összetett struktúrák elkészítésére használni, azt megköszönném.
Ha valaki azt el tudná mondani, hogy mi lehet a bug oka, az is jól jönne. Ugyanis nem tudom, hol ütheti még fel a fejét ... ? (Vagy én értelmezek félre vagy rontok el valamit?)
De ha bárki, bármi bíztatót tud szólni, már az is elég lenne! Több hónapos fejelsztés eredményeként állt elő egy ennyire összetett kód. ... Most dobjam ki? (Netán javaslat, megbízható objektum orientált plattformra?)
No, azt hiszem ennyi. Ha valaki még előtte áll egy ilyennek, ne ágyazzon egymásba objektumokat.
:-(
<?php // PHP referencia bug.
class Adat {
var $value;
function Adat() {
$this->value='';
}
function muvelet() { // Csak a művelet meghívása a fontos
$this->value=''; // Tetszőlege utasítás lehet, vagy akár semmi
}
}
class Fo {
var $adat; // Adat osztályú értékkel fogjuk feltölteni. Őbelőle lesz majd referencia
function Fo($a) {
$this->adat=$a;
$this->adat->muvelet(); // *** Ez a kritikus lépés. Elhagyva jól működik.
}
}
$adat=new Adat();
$fo=new Fo($adat);
// $fo->adat->muvelet(); // *** Itt is kritikus lenne egy ilyen művelet
$masolat=$fo; // Teljesen függetlennek kellene lennie
$masolat->adat->value='jó';
$fo->adat->value='hibás';
print $masolat->adat->value; // Itt a 'jó' érték helyett a 'hibás' jelenik meg.
?>
class Adat {
var $value;
function Adat() {
$this->value='';
}
function muvelet() { // Csak a művelet meghívása a fontos
$this->value=''; // Tetszőlege utasítás lehet, vagy akár semmi
}
}
class Fo {
var $adat; // Adat osztályú értékkel fogjuk feltölteni. Őbelőle lesz majd referencia
function Fo($a) {
$this->adat=$a;
$this->adat->muvelet(); // *** Ez a kritikus lépés. Elhagyva jól működik.
}
}
$adat=new Adat();
$fo=new Fo($adat);
// $fo->adat->muvelet(); // *** Itt is kritikus lenne egy ilyen művelet
$masolat=$fo; // Teljesen függetlennek kellene lennie
$masolat->adat->value='jó';
$fo->adat->value='hibás';
print $masolat->adat->value; // Itt a 'jó' érték helyett a 'hibás' jelenik meg.
?>
Sőt, ha bármit írsz a muvelet()-be azt végre is hajtja. Persze a magyarázatot nem tudom, de ilyen "bonyolultabb" műveletekhez szoktam bevezetni segédválozókat.
--------
Poetro
HIHETETLEN!KÖSZI!!!!
KÖSZI!!!! :-))))))))))
Én is próbálkoztam az összetett hivatkozást kibontani, de hát itt pont nem ... :-)
Úgy tűnik, Te is komplexebb struktúrákat alkotsz PHP-ben. Tudsz még mondani hasonló csúfságokat, amikre számítanom kell? Minden kitalált struktúrádat le tudod végül kódolni? (Még ha trükkösen is?)
Mégegyszer köszi!
BOCS, mégsem jó!
A megoldásod ugyan lefut, de én épp az adat elemváltozón akarok műveletet végezni. A Te változatod a b objektumon végez műveletet, de nekem ez nem jó. Ha pedig b csak egy referenciája $this->adat nak, akkor a hiba továbbra is jelentkezik.
:-(
Tehát ? Ezek szerint az adat elemváltozón műveletet továbbra sem tudok végezni... :-(
Legfeljebb, ha b-t utána visszatöltöm. De mi van, ha az adat objektumom referenciát is tartalmaz? Akkor a másolatképzés nem járható út ...
Ez esetben mégsincs megoldás?
Felcserélés?
Azaz előbb végrehajtod a műveletet az objektumon, majd bepakolod.
--------
Poetro
Kikerülné csupán
Sajnos az eredeti rendszerben sokszor van szükség az elemváltozó műveletének használatára. (Hisz éppen ezért lett objektum az elemváltozóm!)
Ha a valóságban használt "Adat" osztályom nem tartalmazna referenciákta, még helyi műveletelőtti és -utáni másoltaképzésekkel át lehetne hidalni (bár ez is túl csúnya lenne). De mivel referenciák is vannak bennük, még ez sem jöhet szóba.
Jelen pillanatban nem tudok rá megoldást, maximum azt, hogy át kell írnom a kódot promitívebbre. :-O