Teil von  SELFPHP   Teil von  Praxisbuch  Teil von  Neuerungen in PHP 5  Teil von  OOP und PHP 5
Letztes Update: 04.09.2007 20:49:50

Navigation

Seite Startseite
Seite Aktuelles
Seite Seite News*
Seite Seite Pressemitteilungen*
Seite SELFPHP
Seite Seite Über SELFPHP
Seite Seite Werbung
Seite Seite Kontakt
Seite Seite Unsere Banner
Seite Seite Impressum
Seite Qozido
Seite Seite Diving Edition
Seite Seite Snorkeling Edition
Seite SELFPHP Dokumentation
Seite Seite PHP-Skripte
Seite Seite PHP Befehlsreferenz
Seite Seite PHP 5 Praxisbuch
Seite Seite PHP Code Snippets
Seite Seite SELFPHP in Buchform
Seite Anbieterverzeichnis
Seite Seite Globale Branchen
Seite Seite Webhosting/Server
Seite Services
Seite Seite Forum*
Seite Seite RSS-Feeds*
Seite Seite Downloads*
Seite Seite Gratis-Video-Lektionen*
Seite Seite SELFPHP auf Heft-CD*
Seite Seite Newsletter*
Seite Internet Security
 sponsored by  
Seite Stellenangebote*
Sedo - Bei uns wird PHP großgeschrieben
Seite Premium-Partner   
Webhosting/Serverlösungen
Seite Produktempfehlung   
Seite Seite SteadyBackup

 
* Link führt ins Internet


Anbieterverzeichnis
Informieren Sie sich über die Unternehmen in unserem Anbieterverzeichnis!  
 


SELFPHP Forum
Fragen rund um die Themen PHP? In über 100.000 Beiträgen finden Sie sicher die passende Antwort!*  


Newsletter
Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!*

Vorname: 
Name:
E-Mail:
 




 

Objekte klonen




Das durch die Zend Engine 2 veränderte Objektreferenzverhalten führt dazu, dass man stets eine Referenz auf eine Ursprungsklasse erzeugen kann und niemals eine Kopie eines Objekts samt Eigenschaften erhält. Wenn man komplexe Datenstrukturen hat und eine Klasse A erzeugt, die im weiteren Verlauf noch benötigt wird, es aber zusätzlich noch eine Klasse B gibt, die eine Kopie benötigt, um damit einzelne Teile der Objektstruktur zu bearbeiten, ohne dabei die Ursprungsinstanz der Klasse A zu verändern, spielt das neu eingeführte Klonen von Objekten eine bedeutsame Rolle. Hierdurch erhält man sämtliche Eigenschaften des Ursprungsobjekts, inklusive aller Referenzabhängigkeiten.

Wird nun eine Kopie eines Objekts benötigt, kann diese Kopie mithilfe von clone erzeugt werden. Ein Objekt wird nach dem Aufruf von clone $objekt geklont.

Beispiel

<?php

class Fahrzeug
{
  function __construct($typ)
  {
    $this->name  = $typ;
  }
  function ProduziereFahrzeug($obj, $name)
  {
    $obj->name = $name;
  }
}

$mobil = new Fahrzeug("PKW");
$neues_mobil = clone $mobil;

$neues_mobil->ProduziereFahrzeug($neues_mobil, "Fahrrad");

// Ausgabe – PKW
echo $mobil->name;
// Ausgabe – Fahrrad
echo $neues_mobil->name;

echo "Original Objekt:\n";
print_r($mobil);
echo "\n\n";
echo "Geklontes Objekt:\n";
print_r($neues_mobil);

?>

Ausgabe
PKW
Fahrrad

Original Objekt:
Fahrzeug Object
(
    [name] => PKW
)


Geklontes Objekt:
Fahrzeug Object
(
    [name] => Fahrrad
)

Sollen sämtliche Objekteigenschaften geklont werden, dann wird zu allererst überprüft, ob Sie die __clone()-Methode selbstständig definiert haben, um das Klonen selbst zu übernehmen. In diesem Fall sind Sie dafür verantwortlich, die notwendigen Eigenschaften im erzeugten Objekt zu deklarieren. Sollte dies nicht der Fall sein, wird die interne Methode __clone(), über die sämtliche Klassen verfügen, für dieses Objekt ausgeführt, die sämtliche Objekteigenschaften dupliziert. Bei einer abgeleiteten Klasse kann die __clone()-Methode der Elternklasse mit parent::__clone() verwendet werden.

Beispiel

<?php

class Lebewesen
{
  public $name = "";
  
  function __construct()
  {
    $this->name  = "Zelle";
  }
  function __clone()
  {
    $this->name = "Klon-Zelle";
    echo "Ich wurde geklont: ";
  }
}

class Menschen extends Lebewesen
{
  function __construct()
  {
    parent::__clone();
  }
}


$objekt = new Menschen();
print_r($objekt);

?>



Ausgabe
Ich wurde geklont: Menschen Object
(
    [name] => Klon-Zelle
)

Beispiel – Vertiefung

<?php

class Form {
  public $form_farbe;
  public $form_breite;
  public $form_hoehe;

  function setze_farbe($farbe) {
    $this->form_farbe = $farbe;
  }

  function __clone() {
    $this->form_farbe = $this->form_farbe;
    $this->form_breite = 100;
    $this->form_hoehe = $this->form_hoehe;
  }
}

$form_objekt = new Form();
$form_objekt->setze_farbe("blau");
$form_objekt->form_breite = 300;
$form_objekt->form_hoehe = 300;

$clone_objekt = clone $form_objekt;
echo $clone_objekt->form_farbe ."<br>";
echo $clone_objekt->form_breite ."<br>";
echo $clone_objekt->form_hoehe ."<br>";

?>

Ausgabe
blau
100
300

Beim Beispiel handelt es sich um eine fiktive Form, wobei sich inmitten der Klasse die __clone()-Methode befindet. Dadurch besteht die Möglichkeit, Objekteigenschaften mit neuen Werten zu belegen. Nach der Instanz des Form-Objekts werden die Klassenvariablen mit einem Wert initialisiert und die Objekteigenschaften werden weiterführend durch den Aufruf von clone $form_objekt geklont. Bei den nachfolgenden Ausgaben des geklonten Objekts ist festzustellen, dass die Breite innerhalb der __clone()-Methode modifiziert wurde und daher einen veränderten Wert ausgibt. Der Farb- und Höhenwert wurde nicht verändert und entspricht dem der zuvor initialisierten Klassenvariablen.

Beispiel – abschließende Anwendung

<?php

class Adresse {
   static $id = 0;

   function Adresse() {
       $this->id = self::$id++;
   }

   function __clone() {
        $this->id = self::$id++;
        $this->vorname = $this->vorname;
       $this->nachname = $this->nachname;
       $this->ort = "New York";
   }
}

$obj = new Adresse();
$obj->vorname = "Matthias";
$obj->nachname = "Kanengiesser";
$obj->ort = "Berlin";

print $obj->id . "<br>";

$clone_obj = clone $obj;
print $clone_obj->id . "<br>";
print $clone_obj->vorname . "<br>";
print $clone_obj->nachname . "<br>";
print $clone_obj->ort . "<br>";

?>

Ausgabe
0
1
Matthias
Kanengiesser
New York



 




 sponsored by

Sedo - Bei uns wird PHP großgeschrieben


VERIO - An NTT Communications Company


HighText iBusiness


Webspace-Verkauf.de


video2brain




 Premium-Partner
 Webhosting/Serverlösungen

BPI-Systeme


Premium-Partner Pixel X


Premium-Partner First Colo


Premium-Partner dogado Internet




Qozido


© 2001-2008 E-Mail SELFPHP - Damir Enseleit, info@selfphp.deImpressumKontakt