Klassenkommunikation Troubles

D

dbr

Mitglied
Thread Starter
Dabei seit
28.05.2005
Beiträge
45
Reaktionspunkte
0
Habe auf meinem Webhost ein spezielles Problem mit der Verwendung von PHP Klassen die untereinander kommunizieren. Auf meiner lokalen PHP-Installation funktioniert es jedoch reibungslos.

Konkret geht es darum, dass beispielsweise eine Variable einer Mutterklasse nicht von einer Zugriffsklasse verändert werden kann. Siehe untenstehendes Beispiel.

Wie ist dieses Verhalten zu erklären? Und wie kann ich das Problem lösen? Hab einfach keine Idee mehr wie ich da rangehn könnte.


Thx a lot

Grts, Michael


<?

class mutterklasse {

var $publicvar = "";

function mutterklasse() {
}

}

class zugriff {
function zugriff($mutterklasse) {
$mutterklasse->publicvar = "Testvalue";
}
}

$mutterklasse = new mutterklasse();

$zugriff = new zugriff($mutterklasse);

echo "Ausgabe: ".$mutterklasse->publicvar;
// bleibt bei der PHP-Installation des Webhosts leer
?>
 
Meinem Verständniss nach macht es der Online-Rechner hier ganz richtig. $mutterklasse ist nur eine Variable, die hier innerhalb der Methode zugriff->zugriff() nicht verfügbar ist.
 
naja aber im konstruktor der klasse zugriff wird ein objekt von mutterklasse übergeben über welches es nun wieder möglich ist auf die mutterklasse zuzugreifen. auslesen beispielsweise funktioniert ja soweit. nur das verändern dürfte ev. wegen diverser sicherheitseinstellungen nicht verfügbar sein. die mutterklasse verliert den wert sobald die funktionen der zugriffsklasse durchlaufen wurden.
 
Das das OO-mäßig nicht sauber ist, weißt Du aber?
Die Zugriffe auf Instanzvariable sollten immer mit Objektmethoden funktioniern, auch bei public Variablen ( die es ja erst ab PHP5 gibt!). Das heißt Mutterklasse müßte eigentlich zwei Methoden getMyVar() und setMyVar() enthalten. Diese kapseln dann OO-mäßig den Zugriff und den Wert in der Instanz eines Objektes. Ein anderes Objekt kann dann ja über diese Accessoren darauf zugreifen. Z.B. im Concstructor.


__construct {
neuvar=$mutterklasse->getMyVar();

}

new ist nicht mehr als ein Allocater für den Speicherplatz eines solchen Objektes. Das man das als Funktion mit Parametern aufruft, ist mir neu!
Wenn dann bekommt die Klasse einen Constructor ( in PHP4 manuell), der dann mit den Parametern aufgerufen werden kann.
 
Zuletzt bearbeitet:
Hallo,

so funktioniert es. Wie schon gesagt wurde, um
PHP5 treu zu bleiben aber PHP4 nicht auszuschliessen,
solltest du __construct verwenden.

Bei deiner Klasse "zugriff" sollte die Variable $mutterklasse
eine Referenz sein. In deinem Fall auf die Klasse
mutterklasse.

Hier die Lösung:

PHP:
<?php

class mutterklasse
{
	var $publicvar;
	
	function mutterklasse()
	{
		mutterklasse::__construct();
	}

	function __construct()
	{
		$this->publicvar = '';
	}

}

class zugriff
{

	function zugriff(&$mutterklasse)
	{
		zugriff::__construct($mutterklasse);
	}

	function __construct(&$mutterklasse)
	{
		$mutterklasse->publicvar = "Testvalue";
	}	
}

$mutterklasse =& new mutterklasse();

$zugriff =& new zugriff($mutterklasse);

echo "Ausgabe: ".$mutterklasse->publicvar;
?>

Gruß, Micha
 
Zuletzt bearbeitet:
Ja, so wie Micha das schreibt, ist es plausibel. OO-mäßig ist das allerdings weiterhin voll am Konzept vorbei. $zugriff greift direkt auf Instanzvariabln eines fremden Objektes zu! Wenn das 20 Zeilen eines n-tausend-Zeilen Projektes wären, so wäre das die Sollbruchstelle bei der nächsten Änderung des Projektes.
Wenn schon OO, dann doch bitte mit allen Vorteilen, also Accessoren für jede Instanzvariable. Was passiert wenn Publicvar ein array wird? Wo ist dann der OO-Vorteil hin?
 
thx for help! hab das problem nun mit einer referenz gelöst...

@wegus... das setzen und auslesen der publicvar passiert bei mir natürlich mit funktionen. jedoch hab ich im beispiel zu demonstrationszwecken die variable auf die harte tour beschrieben. ;)

bei genauerem nachdenken ist das mit der referenz aber ohnehin die einzige saubere lösung... doch wär ich da im traum nicht selbst draufgekommen *g*

danke nochmal!

schöne grüße
Michael
 
jedoch hab ich im beispiel zu demonstrationszwecken die variable auf die harte tour beschrieben.

dann hab ich auch gar nix gesagt :rolleyes: *flöt*
 
hab mich nun ein bisschen schlau gemacht.

im neuen objektmodell von php5 werden objekte immer als referenzen betrachtet. das explizite übergeben als referenz ist also nicht mehr notwendig.

ich hab mich nun dafür entschieden mein projekt ausschließlich auf php5 laufen zu lassen, da der code durch das neue objektmodell weitaus übersichtlicher ist.

just for info :)
 
Zurück
Oben Unten