4ipok Geschrieben 6. August 2008 Teilen Geschrieben 6. August 2008 Hallo allerseits hab endlich nach lange zeit Inet ^^ Und als erstes will ich die Hirngespinste aus mein Kopf vertreiben *g* Ich hab irgend wie das Problem mit Durchblick bei Referenzen in PHP, ich komm da nicht ganz ducht Könte mir jemand helfen die Referenzen zu setzen in die parendClass Klassee so dass man daselbe Ergebniss in Ausgabe 1 kriegt wie in 2 also dass $testObj->myVirtualVar nur Referenz von $myVar ist <?php class parentClass { # beinhaltet alle Objekte protected $objs = array(); # speichert Objekte protected function __set($objName, $objVars) { $this->objs[$objName] = $objVars; } # gibt Objekte weiter protected function __get($objName) { if(isset($this->objs[$objName])){ $return =& $this->objs[$objName]; } else { $return = NULL; } return $return; } # speichert eine Referenz zum Objekt public function load($objName, &$obj) { if(isset($this->objs[$objName])){ unset($this->objs[$objName]); } $this->objs[$objName] =& $obj; } } class kidClass extends parentClass{ //code } $testObj = new kidClass(); $myVar = 10; $testObj->myVirtualVar = $myVar; $testObj->myVirtualVar++; $myVar--; echo '$testObj->myVirtualVar = ' . $testObj->myVirtualVar . "<br />\n\r"; echo '$myVar = ' . $myVar . "<br />\n\r"; /* Ausgabe: 2 $testObj->myVirtualVar = 11 $myVar = 9 */ $myVar2 = 20; $testObj->load("myVirtualVar2", $myVar2); $testObj->myVirtualVar2++; $myVar2--; echo '$testObj->myVirtualVar2 = ' . $testObj->myVirtualVar2 . "<br />\n\r"; echo '$myVar2 = ' . $myVar2 . "<br />\n\r"; /* Ausgabe: 2 $testObj->myVirtualVar2 = 20 $myVar2 = 20 */ ?>[/PHP] Ich danke aujeden Fall schon mal voraus Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Shadowman Geschrieben 6. August 2008 Teilen Geschrieben 6. August 2008 sry, ich habe leider nicht wirklich ahnung von oop in php, aber haste schonmal das hier versucht? protected function __set($objName, &$objVars) { $this->objs[$objName] = $objVars; } [/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
4ipok Geschrieben 6. August 2008 Autor Teilen Geschrieben 6. August 2008 sry, ich habe leider nicht wirklich ahnung von oop in php, aber haste schonmal das hier versucht? protected function __set($objName, &$objVars) { $this->objs[$objName] = $objVars; } [/PHP] hatte ich probiert gibt Fehlermeldung: [b]Fatal error[/b]: Couldn't execute method kidClass::__set in [b]Unknown[/b] on line [b]0[/b] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Shadowman Geschrieben 6. August 2008 Teilen Geschrieben 6. August 2008 nächster versuch mit anderem ansatz^^ du übergibts der methode anstatt die ganze var nur die referenz: $testObj->myVirtualVar = &$myVar; das müsste rein theoretisch gehen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
4ipok Geschrieben 6. August 2008 Autor Teilen Geschrieben 6. August 2008 nächster versuch mit anderem ansatz^^ du übergibts der methode anstatt die ganze var nur die referenz: $testObj->myVirtualVar = &$myVar; das müsste rein theoretisch gehenDas gibt Zwar keine Fehler aus, aber es functioniert überhaut nix so wie ich es Mir vorstelle <?php class parentClass { protected $objs = array(); protected function __set($objName, $objVars) { $this->objs[$objName] = &$objVars; } protected function __get($objName) { if(isset($this->objs[$objName])){ $return =& $this->objs[$objName]; } else { $return = NULL; } return $return; } public function load($objName, &$obj) { if(isset($this->objs[$objName])){ unset($this->objs[$objName]); } $this->objs[$objName] = &$obj; } } class kidClass extends parentClass{ //code } $testObj = new kidClass(); $myVar = 10; $testObj->myVirtualVar = $myVar; $testObj->myVirtualVar++; $myVar--; echo '$testObj->myVirtualVar = ' . $testObj->myVirtualVar . "<br />\n\r"; echo '$myVar = ' . $myVar . "<br />\n\r"; /* Ausgabe: 2 $testObj->myVirtualVar = 11 $myVar = 9 */ $myVar2 = 20; $testObj->load("myVirtualVar2", $myVar2); $testObj->myVirtualVar2++; $myVar2--; echo '$testObj->myVirtualVar2 = ' . $testObj->myVirtualVar2 . "<br />\n\r"; echo '$myVar2 = ' . $myVar2 . "<br />\n\r"; /* Ausgabe: 2 $testObj->myVirtualVar2 = 20 $myVar2 = 19 */ ?>[/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Shadowman Geschrieben 6. August 2008 Teilen Geschrieben 6. August 2008 (bearbeitet) ich meinte es auch eher so: <?php class parentClass { protected $objs = array(); protected function __set($objName, $objVars) { $this->objs[$objName] =& $objVars; } protected function __get($objName) { if(isset($this->objs[$objName])){ $return =& $this->objs[$objName]; } else { $return = NULL; } return $return; } public function load($objName, &$obj) { if(isset($this->objs[$objName])){ unset($this->objs[$objName]); } $this->objs[$objName] = &$obj; } } class kidClass extends parentClass{ //code } $testObj = new kidClass(); $myVar = 10; $testObj->myVirtualVar = &$myVar; $testObj->myVirtualVar++; $myVar--; echo '$testObj->myVirtualVar = ' . $testObj->myVirtualVar . "<br />\n\r"; echo '$myVar = ' . $myVar . "<br />\n\r"; /* Ausgabe: 1 $testObj->myVirtualVar = ?? $myVar = 9 */ $myVar2 = 20; $testObj->load("myVirtualVar2", $myVar2); $testObj->myVirtualVar2++; $myVar2--; echo '$testObj->myVirtualVar2 = ' . $testObj->myVirtualVar2 . "<br />\n\r"; echo '$myVar2 = ' . $myVar2 . "<br />\n\r"; /* Ausgabe: 2 $testObj->myVirtualVar2 = ?? $myVar2 = 19 */ ?>[/PHP] Bearbeitet 6. August 2008 von Shadowman Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
4ipok Geschrieben 6. August 2008 Autor Teilen Geschrieben 6. August 2008 ich meinte es auch eher so: <?php class parentClass { protected $objs = array(); protected function __set($objName, $objVars) { $this->objs[$objName] =& $objVars; } protected function __get($objName) { if(isset($this->objs[$objName])){ $return =& $this->objs[$objName]; } else { $return = NULL; } return $return; } public function load($objName, &$obj) { if(isset($this->objs[$objName])){ unset($this->objs[$objName]); } $this->objs[$objName] = &$obj; } } class kidClass extends parentClass{ //code } $testObj = new kidClass(); $myVar = 10; $testObj->myVirtualVar = &$myVar; $testObj->myVirtualVar++; $myVar--; echo '$testObj->myVirtualVar = ' . $testObj->myVirtualVar . "<br />\n\r"; echo '$myVar = ' . $myVar . "<br />\n\r"; /* Ausgabe: 1 $testObj->myVirtualVar = ?? $myVar = 9 */ $myVar2 = 20; $testObj->load("myVirtualVar2", $myVar2); $testObj->myVirtualVar2++; $myVar2--; echo '$testObj->myVirtualVar2 = ' . $testObj->myVirtualVar2 . "<br />\n\r"; echo '$myVar2 = ' . $myVar2 . "<br />\n\r"; /* Ausgabe: 2 $testObj->myVirtualVar2 = ?? $myVar2 = 19 */ ?>[/PHP] hehe das Hatte ich auch schonma in erwegung gezogen Aber der Fehler ([b]Fatal error:[/b] Cannot assign by reference to overloaded object in [b]index.php[/b] on line [b]29[/b]) störte meine Logik Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Shadowman Geschrieben 6. August 2008 Teilen Geschrieben 6. August 2008 ne kleine frage am rand...warum sind deine setter und getter methoden protected und net public? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
4ipok Geschrieben 6. August 2008 Autor Teilen Geschrieben 6. August 2008 ne kleine frage am rand...warum sind deine setter und getter methoden protected und net public?da dies ein codeauschnitt ist, und die nur in Kindklassen verfügbas sein sollen und nicht von ausen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Shadowman Geschrieben 6. August 2008 Teilen Geschrieben 6. August 2008 ich mache mich in ein paar minuten auf den heimweg. wenn ich dann etwas zeit finde werde ich mich mal damit auseinander setzen, da ich hier im moment keinen server mit PHP habe. also bis später Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
4ipok Geschrieben 6. August 2008 Autor Teilen Geschrieben 6. August 2008 ich mache mich in ein paar minuten auf den heimweg. wenn ich dann etwas zeit finde werde ich mich mal damit auseinander setzen, da ich hier im moment keinen server mit PHP habe. also bis späterah ok ich habe zeit danke dir schonma für deine Hilfe^^ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tweetymax Geschrieben 6. August 2008 Teilen Geschrieben 6. August 2008 Probiers mal so: <?php class parentClass { protected $objs = array(); protected function __set($objName, $objVars) { $this->objs[$objName] =& $objVars; } protected function __get($objName) { if(isset($this->objs[$objName])){ $return =& $this->objs[$objName]; } else { $return = NULL; } return $return; } public function load($objName, &$obj) { if(isset($this->objs[$objName])){ unset($this->objs[$objName]); } $this->objs[$objName] = &$obj; } } class kidClass extends parentClass{ //code } $testObj = new kidClass(); $myVar = 10; $testObj->load("myVirtualVar", &$myVar); //$testObj->myVirtualVar = &$myVar; $testObj->myVirtualVar++; $myVar--; echo '$testObj->myVirtualVar = ' . $testObj->myVirtualVar . "<br />\n\r"; echo '$myVar = ' . $myVar . "<br />\n\r"; /* Ausgabe: 1 $testObj->myVirtualVar = ?? $myVar = 9 */ $myVar2 = 20; $testObj->load("myVirtualVar2", $myVar2); $testObj->myVirtualVar2++; $myVar2--; echo '$testObj->myVirtualVar2 = ' . $testObj->myVirtualVar2 . "<br />\n\r"; echo '$myVar2 = ' . $myVar2 . "<br />\n\r"; /* Ausgabe: 2 $testObj->myVirtualVar2 = ?? $myVar2 = 19 */ ?>[/PHP] Eine Zeile habe ich auskommentiert. Der Fehler war, dass du versuchst auf eine Eigenschaft zuzugreifen, welche noch nicht definiert war. Simpler Fehler mit bösem Effekt Gruß vom TsChIeP Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
4ipok Geschrieben 6. August 2008 Autor Teilen Geschrieben 6. August 2008 Probiers mal so: <?php class parentClass { protected $objs = array(); protected function __set($objName, $objVars) { $this->objs[$objName] =& $objVars; } protected function __get($objName) { if(isset($this->objs[$objName])){ $return =& $this->objs[$objName]; } else { $return = NULL; } return $return; } public function load($objName, &$obj) { if(isset($this->objs[$objName])){ unset($this->objs[$objName]); } $this->objs[$objName] = &$obj; } } class kidClass extends parentClass{ //code } $testObj = new kidClass(); $myVar = 10; $testObj->load("myVirtualVar", &$myVar); //$testObj->myVirtualVar = &$myVar; $testObj->myVirtualVar++; $myVar--; echo '$testObj->myVirtualVar = ' . $testObj->myVirtualVar . "<br />\n\r"; echo '$myVar = ' . $myVar . "<br />\n\r"; /* Ausgabe: 1 $testObj->myVirtualVar = ?? $myVar = 9 */ $myVar2 = 20; $testObj->load("myVirtualVar2", $myVar2); $testObj->myVirtualVar2++; $myVar2--; echo '$testObj->myVirtualVar2 = ' . $testObj->myVirtualVar2 . "<br />\n\r"; echo '$myVar2 = ' . $myVar2 . "<br />\n\r"; /* Ausgabe: 2 $testObj->myVirtualVar2 = ?? $myVar2 = 19 */ ?>[/PHP] Eine Zeile habe ich auskommentiert. Der Fehler war, dass du versuchst auf eine Eigenschaft zuzugreifen, welche noch nicht definiert war. Simpler Fehler mit bösem Effekt Gruß vom TsChIeP Also das ist nicht Hilfreich da das Endprodukt so ausehen soll: $testObj->myVirtualVar soll nur die Referenz zu $myVar ohne der load() Methode erhalten $testObj->myVirtualVar2 soll nur die Referenz zu $myVar2 mit der load() Methode erhalten Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
4ipok Geschrieben 6. August 2008 Autor Teilen Geschrieben 6. August 2008 Ich merke grad das es nicht gehen kann, da zbs. ein string $testObj->myVirtualVar = "text" nicht verlinkbar ist. Daher auch die Fehlermeldung wenn ich bei Methode __set den 2 Argument referenziere. Die altanative wäre $testObj->myVirtualVar = 10; //im $testObj->objs['myVirtualVar'] wird int 10 gesezt; $myVar = &$testObj->myVirtualVar; //$myVar wird zu $testObj->objs['myVirtualVar'] referenziert [/php] doch irgen wie scheitert die Referenzierung $myVar = &$testObj->myVirtualVar; [PHP]class parentClass { var $objs = array(); function __set($objName, $objVars) { $this->objs[$objName] = $objVars; } function __get($objName) { if(isset($this->objs[$objName])){ $return =& $this->objs[$objName]; } else { $return = NULL; } return $return; } function load($objName, &$obj) { if(isset($this->objs[$objName])){ unset($this->objs[$objName]); } $this->objs[$objName] =& $obj; } } class kidClass extends parentClass{ //code } $testObj = new kidClass(); $testObj->myVirtualVar = 10; $myVar = &$testObj->myVirtualVar; $testObj->myVirtualVar++; $myVar--; echo '$testObj->myVirtualVar = ' . $testObj->myVirtualVar . "<br />\n\r"; echo '$myVar = ' . $myVar . "<br />\n\r"; $myVar2 = 20; $testObj->load("myVirtualVar2", $myVar2); $testObj->myVirtualVar2++; $myVar2--; echo '$testObj->myVirtualVar2 = ' . $testObj->myVirtualVar2 . "<br />\n\r"; echo '$myVar2 = ' . $myVar2 . "<br />\n\r"; /* Ausgabe: $testObj->myVirtualVar = 11 $myVar = 9 $testObj->myVirtualVar2 = 20 $myVar2 = 20 Endprodukt soll: $testObj->myVirtualVar soll nur die Referenz zu $myVar ohne der load() Methode erhalten $testObj->myVirtualVar2 soll nur die Referenz zu $myVar2 mit der load() Methode erhalten */ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Aiun Geschrieben 6. August 2008 Teilen Geschrieben 6. August 2008 (bearbeitet) function &__get($objName) { if(isset($this->objs[$objName])){ $return =& $this->objs[$objName]; } else { $return = NULL; } return $return; }[/PHP] noch nie gesehen diese notation, scheint aber zu funktionieren. oder [PHP] function __get($objName) { if(isset($this->objs[$objName])){ return $this->objs[$objName]; } else { $return = NULL; } return $return; } Es sei gesagt das Pointer in PHP keine gute idee sind, dafür ist es ein viel zu instabiles Sprachelement das schnell zu verwirrung führt, gleichzeitig arbeitest du mit magischen methoden (__get, __set) ich würde mir da eine alternative überlegen, gut möglich das es je nach PHP version mal nicht geht. Bearbeitet 6. August 2008 von Aiun Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
4ipok Geschrieben 6. August 2008 Autor Teilen Geschrieben 6. August 2008 function &__get($objName) { if(isset($this->objs[$objName])){ $return =& $this->objs[$objName]; } else { $return = NULL; } return $return; }[/PHP] noch nie gesehen diese notation, scheint aber zu funktionieren. oder [PHP] function __get($objName) { if(isset($this->objs[$objName])){ return $this->objs[$objName]; } else { $return = NULL; } return $return; } Es sei gesagt das Pointer in PHP keine gute idee sind, dafür ist es ein viel zu instabiles Sprachelement das schnell zu verwirrung führt, gleichzeitig arbeitest du mit magischen methoden (__get, __set) ich würde mir da eine alternative überlegen, gut möglich das es je nach PHP version mal nicht geht. Da ich nur 1 Paket für Grundfunktionen, wo der rest darauf basiert, entwickle. Mach ich mir keine Gedanken um PHP version. Da unsere Server PHP nur beim beginn eines Projektes draufgespielt wird. Sollte der Fall aber Auftreten, muss ich nur die Grundfunktionen anpassen. function __get($objName) { if(isset($this->objs[$objName])){ return $this->objs[$objName]; } else { $return = NULL; } return $return; } [/PHP]würde bei mir nicht klappen, da das eine vereeinfachte Klasse ist, ist da nicht alles drinne. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.