Günther S: OOP: clone

Hallo,

ich seh gerade anscheinend den Wald vor lauter Bäumen nicht und hänge bei folgendem Problem fest:

  
// Variante 1  
$login = clone($_SESSION['login_object']); // klappt hervorragend und hat die erwünschte wirkung (alle attribute von $_SESSION['login_object'] werden in $login kopiert.  
  
// Variante 2  
class Login()  
{  
 public function __construct()  
 {  
  // dank einiger Debug-Ausgaben weiß ich, dass die if-Bedingung betreten wird und trotzdem nicht das gewünschte Ergebnis erzielt wird.  
  if(is_object($_SESSION['login_object']))  
  {  
   return clone($_SESSION['login_object']);  
  }  
 }  
}  
  
$login = new Login();  
// in diesem Fall ist $login zwar eine ganz normale Instanz der Klasse Login, aber die Attribute von $_SESSION['login_object'] wurden nicht übernommen. Wie bekomme ich das hin?  

Gruß,
Günther

  1. echo $begrüßung;

    Ich nehme an, es handelt sich um PHP 5. Welche Version ist es genau? (Diese Information wäre nur zum Nachvollziehen von Problem hilfreich, wenn meine nachfolgende Erklärung noch nicht reicht.)

    $login = clone($_SESSION['login_object']); // klappt hervorragend und hat die erwünschte wirkung (alle attribute von $_SESSION['login_object'] werden in $login kopiert.

    clone ist keine Funktion sondern ein Schlüsselwort, das allein steht. Die Klammern bewirken bei dir nur, dass die Variable $_SESSION['login_object'] zu einem Ausdruck wird.

    class Login()
    public function __construct()
       return clone($_SESSION['login_object']);

    Konstruktoren geben unter PHP 5 nur Objekte der jeweiligen Klasse zurück. Unter PHP 4 war es noch möglich etwas ganz anderes zurückzugeben.

    $login = new Login();
    // in diesem Fall ist $login zwar eine ganz normale Instanz der Klasse Login, aber die Attribute von $_SESSION['login_object'] wurden nicht übernommen. Wie bekomme ich das hin?

    Verwende entweder das Factory- oder das Singleton-Pattern.

    echo "$verabschiedung $name";