000
11.11.2005, 16:17
scus
|
Moin, ich hab ne kleine Frage: Ich habe eine Klasse (bsp: classA) mit einer Funktion die in der Klasse eine weitere erzeugt:
<?php class classA { var $subClass;
function classA() { //Nichts }
function newClass() { $this->subClass = new classB(); return $this->subClass; } } ?>
Jetzt möchte ich aber, dass die Funktion einen Zeiger und nicht das ganze Objekt zurückgibt, so dass das hier funktionieren würde:
<?php class classB() { var $name = "Default";
function classB() { //Nichts }
function set($newname) { $this->name = $newname; } function get() { echo "Mein Name ist ".$this->name."!\n"; } }
$a = new classA(); $b = $a->newClass(); $b->set("Dieter"); $a->subClass->get(); //Gibt "Mein Name ist Default!\n" aus ?>
Was funktionieren würde:
<?php $a = new classA(); $a->newClass(); $b = &$a->subClass; $b->set("Dieter"); $a->subClass->get(); ?>
Geht das auch in einer Zeile?
Was ich sonst noch probiert habe:
<?php [...] function newClass(&$link) { $this->subClass = new classB(); $link = &$this->subClass; }
$a->newClass($b); $b->set("Dieter"); [...] ?>
Da spuckt er mir allerdings die Fehlermeldung aus, dass $b kein Objekt sei...
--
sincères amitiés scus -- Tand, Tand ist das Gebilde von Menschenhand
|
|
Profil || Suche
|
001
11.11.2005, 19:07
Buster
|
zu 2.:
Lösung 1 (PHP 4):
<?php [...] function newClass(&$link) { /* * Immernoch nicht ideal, weil PHP4 das neu erzeugte Objekt * auf die linke Seite kopiert, anstatt zu referenzieren. D.h. * du hast implizit eine zusätzliche Instanz erzeugt. */ $link = new classB; // $b = new classB $this->subClass =& $link; // $this->subClass =& $b; }
$a->newClass($b); $b->set("Dieter"); [...] ?>
Hat bei dir vorher nicht funktioniert da du die Referenz $link überschreibst. Vorher war sie ein Alias von $b und nachher ein Alias von $this->subClass. Und es gibt in PHP keine Zeiger wie man sie aus C/C++ her kennt, sondern nur Referenzen bzw. Aliasnamen. PHP arbeitet mit "Referenzzähler" und "Garbage Collector". Am besten mal nach den zwei Schlüsselwörtern über google suchen, dann muss ich das hier nicht erklären was das ist. Dann verstehst du vielleicht auch besser wie man mit PHP Variablen und Referenzen umgeht.
Ideale Lösung 2 (PHP 4):
<?php [...] function & newClass() { $this->subClass =& new classB; return $this->subClass; }
$b =& $a->newClass(); // $b =& $this->subClass; $b->set("Dieter"); [...] ?>
In PHP 5 is das noch genialer. Du brauchst auch keinen Referenzzuweisungsoperator (=&) mehr um Kopien zu vermeiden, das löst PHP 5 von selbst. Aber sicher ist sicher.
Genialste Lösung (PHP 5):
<?php [...] function & newClass() { $this->subClass =& new classB; return $this->subClass; }
$a->newClass()->set("Dieter"); // $this->subClass->set("Dieter"); [...] ?>
zu 1.:
Da musst du auch mit dem Referenzzuweisungsoperator arbeiten.
Lösung (PHP 4):
<?php [...] function & newClass() { $this->subClass =& new classB; return $this->subClass; }
$a =& new classA; // Kopie meiden! $b =& $a->newClass(); $b->set("Dieter"); $a->subClass->get(); // Gibt "Mein Name ist Dieter!\n" aus!
// PHP 5:
$a =& new classA; $a->newClass()->set("Dieter"); $a->subClass->get();
[...] ?>
Btw was ist das (s. oben)? ^^
<?php class classB() { ?>
--
Dieser Beitrag wurde am 11.11.2005 um 19:44 von Buster bearbeitet.
|
|
Profil || Suche
|
002
17.11.2005, 14:04
scus
|
So, endlich komme ich mal dazu zu Antworten. Erstmal vielen Dank! Hat mir sehr geholfen, ich hab mich für Lösung Nr. 2 entschieden, da (a) $b immerwieder neu gesetzt wird (ist nur temporär) und (b) ich nur PHP 4 zur verfügung hab.
Das ganze soll ein Templatesystem werden, welches auf Blöcken basiert ($b ist immer ein neuer Block). So kann ich dann folgendes machen:
<?php $b = &$tpl->newBlock("main"); $b->Assign("headline", "Neues aus Oldenburg"); $b->Assign("text", "Bla bla bla bla"); ?>
Falls du verstehst, was ich meine...
--
sincères amitiés scus -- Tand, Tand ist das Gebilde von Menschenhand
|
|
Profil || Suche
|