ugrás a tartalomhoz

PHP 4 bug (?)

linuxforum · 2005. Már. 18. (P), 15.12
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.
:-(

<?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.
?>
 
1

Poetro · 2005. Már. 18. (P), 16.17

<?php // PHP referencia bug.
class Adat {
 var $value;
 function Adat() {
   $this->value='';
 }
 
 function muvelet() { // Csak a mu"velet meghívása a fontos
   $this->value=''; // Tetszo"lege utasítás lehet, vagy akár semmi
 }
}

class Fo {
 var $adat; // Adat osztályú értékkel fogjuk feltölteni. O"belo"le lesz majd referencia
 function Fo($a) {
   $this->adat=$a;
   $b=$this->adat; //segédváltozó bevezetése
   $b->muvelet();
 }
}

$adat=new Adat();
$fo=new Fo($adat);
// $fo->adat->muvelet(); // *** Itt is kritikus lenne egy ilyen mu"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.
?>
Így jól műxik.
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
2

HIHETETLEN!KÖSZI!!!!

linuxforum · 2005. Már. 18. (P), 16.33
HIHETETLEN!
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!
3

BOCS, mégsem jó!

linuxforum · 2005. Már. 18. (P), 16.47
Elhamarkodott volt az örömöm...
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?
4

Felcserélés?

Poetro · 2005. Már. 18. (P), 17.21
És mi van, ha felcseréled a műveleteket?
Azaz előbb végrehajtod a műveletet az objektumon, majd bepakolod.

<?php
class Fo {
 var $adat; // Adat osztályú értékkel fogjuk feltölteni. O"belo"le lesz majd referencia
 function Fo($a) {
   $a->muvelet(); // művelet előrehozva
   $this->adat=$a;
 }
}
?>
Ha kell később megint, lehet érdemes kivenni, és újraberakni. Persze hatékonyság szempontjából nem ideális. Tényleg nem működik a referenciás dolog. Mondjuk nekem ritkán kell ilyen dolgokat csinálni.
--------
Poetro
5

Kikerülné csupán

linuxforum · 2005. Már. 19. (Szo), 11.09
Ha felcserélem a sorrendet, akkor a példám jól működik, de csak azért, mert kihagyom a kritikus lépést: egy elemváltozó műveletének a használatát.
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