4ipok Geschrieben 6. August 2008 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
Shadowman Geschrieben 6. August 2008 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]
4ipok Geschrieben 6. August 2008 Autor 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]
Shadowman Geschrieben 6. August 2008 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
4ipok Geschrieben 6. August 2008 Autor 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]
Shadowman Geschrieben 6. August 2008 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
4ipok Geschrieben 6. August 2008 Autor 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
Shadowman Geschrieben 6. August 2008 Geschrieben 6. August 2008 ne kleine frage am rand...warum sind deine setter und getter methoden protected und net public?
4ipok Geschrieben 6. August 2008 Autor 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
Shadowman Geschrieben 6. August 2008 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
4ipok Geschrieben 6. August 2008 Autor 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^^
Tweetymax Geschrieben 6. August 2008 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
4ipok Geschrieben 6. August 2008 Autor 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
4ipok Geschrieben 6. August 2008 Autor 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 */
Aiun Geschrieben 6. August 2008 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
4ipok Geschrieben 6. August 2008 Autor 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.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden