Zum Inhalt springen

PHP5 Objekt Referenz


Empfohlene Beiträge

Hallo allerseits :D

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Das 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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Shadowman
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

ah ok ich habe zeit

danke dir schonma für deine Hilfe^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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
*/

Link zu diesem Kommentar
Auf anderen Seiten teilen


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 von Aiun
Link zu diesem Kommentar
Auf anderen Seiten teilen


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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...