Hauptmenü

Untermenü

OOP PHP5 - Grundlagen - Klonen

1. Was ist Klonen nicht

PHP erlaubt uns, die Referenz, also den Verweis auf ein Objekt, in einer zusätzlichen Variablen abzuspeichern. Ändert sich dann beim Original etwas, so gilt das auch für die zweite Referenzvariable, da beide auf dasselbe Objekt verweisen.


class Frau
{
  protected $name;
  public function setName($value)
  {
    $this -> name $value;
  }
}
$doerte = new Frau;
// Variablenzuweisung 
$doerte2 $doerte;
$doerte -> setName('Dörte');  
print_r($doerte);
print_r($doerte2);
$doerte2 -> setName('Siglinde');  
print_r($doerte);
print_r($doerte2);

2. Echtes Klonen

... ist in der Praxis im Moment nur mit Schafen, Mäusen und anderem Getier möglich. Programmiersprachen sind da schon ein wenig weiter. Und wozu? Mal abgesehen von den ethischen Problemen könnte im Laufe der Programmierung eine Situation eintreten, die das erfordert. Dazu nehmen wir mal folgendes Beispiel.

Dieters Fiffi namens Waldi hat das Zeitliche gesegnet. Und weil er ein treuer Freund war und die Frauen wie ein Magnet anzog, entschließt sich Dieter ihn zu klonen. Dies geschieht mit dem Schlüsselwort clone.


$waldi = new Hund;
$klon  = clone $waldi;

Bei dem $klon handelt es sich um eine so genannte seichte Kopie. Und das ist mal ein gutes Beispiel dafür, dass man sich bei Bezeichnungen auch mal ein wenig vergaloppieren kann. Aber egal.

3. Der feine Unterschied

... zum ersten Beispiel liegt in der Verarbeitung der Eigenschaften. Nachdem ein Objekt geklont wurde, sind die nämlich identisch mit denen des Originals.


class Hund
{
  protected $temperament;
  public function setTemperament($value)
  {
    $this -> temperament $value;      
  }
}
//Objekt Waldi mit Eigenschaft
$waldi = new Hund;
$waldi -> setTemperament ('wild und ungestüm');
print_r($waldi);
// Klon von Waldi, selbe Eigenschaft
$klon = clone $waldi;
print_r($klon);

Aber!

... wenn man nun die Eigenschaft beim Klon ändert, so wirkt sich das nur auf ihn aus, nicht auf das Original. Nehmen wir einfach mal an, dass beim Klonen ein Fehler aufgetreten ist und die "Kopie" ihr Temperament ändert.


$waldi = new Hund;
$waldi -> setTemperament ('wild und ungestüm');
$klon = clone $waldi;
$klon -> setTemperament ('total verschlafen');
print_r($waldi);
print_r($klon);

An diesem Beispiel seht ihr deutlich, dass das Temperament von Waldi immer noch "wild und ungestüm" ist, während der Klon mittlerweile "total verschlafen" ist.

4. Ein Hinweis

Dieses Beispiel diente nur zur Erklärung, wie man ein Objekt klont. Im Sinne der Objektorientierten Programmierung gab es hier einige logische Lücken. Aber so ist das halt mit konkreten Beispielen. Die kollidieren manchmal mit der "reinen" Lehre.

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt