Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
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-Quellcode:<?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-Quellcode:<?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-Quellcode:<?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-Quellcode:<?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

zum Seitenanfang zum Seitenende Profil || Suche
001
11.11.2005, 19:07
Buster



zu 2.:

Lösung 1 (PHP 4):

PHP-Quellcode:<?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-Quellcode:<?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-Quellcode:<?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-Quellcode:<?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-Quellcode:<?php
class classB() {
?>

--


Dieser Beitrag wurde am 11.11.2005 um 19:44 von Buster bearbeitet.
zum Seitenanfang zum Seitenende 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-Quellcode:<?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

zum Seitenanfang zum Seitenende Profil || Suche