Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

PHP5 Objekt Referenz

Empfohlene Antworten

Veröffentlicht

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

  • Autor
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]

  • Autor
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]

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

  • Autor
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

  • Autor
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
  • Autor
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^^

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

  • Autor
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

  • Autor

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


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

  • Autor

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.