Hauptmenü

Untermenü

OOP PHP5 - Magische Methoden - Weitere Möglichkeiten

1. Ein Wort in eigener Sache

Neben __construct und __destruct gibt es noch einige andere magischen Methoden, die nicht zu den Interzeptormethoden gehören. Allerdings habe ich die bis auf zwei noch nie im praktischen Einsatz benötigt. Darum werde ich hier auch nur diese beiden kurz vorstellen und den Rest ignorieren. Wen es trotzdem interessiert, bitteschön. An dieser Stelle gibt es eine komplette Liste.

2. __toString

Diese magische Methode gibt eine vorgegeben Zeichenkette zurück, wenn man versucht, die Objektreferenz der entsprechenden Klasse direkt über echo oder print auszugeben. Das gilt aber nicht(!) bei print_r oder var_dump. Ach ja, manche zählen __toString zu den Interzeptormethoden. Allerdings kollidiert das mit dem so genannten Overloading, wo es nicht aufgeführt wird. Darum habe ich es hierhin verbannt.


class Frau
{
  protected $name;
  public function __construct($name)
  {
    $this -> name $name;
  }
  public function __toString() 
  {
    return get_class($this).' '.$this -> name;
  }
}
$doerte = new Frau ('Dörte');
// Ergibt "Frau Dörte"
echo $doerte;

Hier erhalten wir den Klassennamen (Details dazu kommen gleich) und die Eigenschaft name. Wozu braucht man denn nun diese Methode? Nun, das ist nicht so ganz einfach zu erklären. Ich selber habe erst zweimal damit zu tun gehabt, als ich den Klassennamen für eine ziemlich merkwürdige Fallunterscheidung benötigte. Die war aber nicht von mir! Ich musste nur etwas anpassen.

3. __clone

Wenn man von einem Objekt zusätzliche Unterobjekte erzeugt, so werden die beim Klonen nur als Referenz zurückgegeben. Wenn man das vermeiden will, oder direkt Eigenschaften ändern möchte, so geschieht dies mit obiger Methode. Nehmen wir dazu mal folgendes Beispiel.

Dieter ist im Internet auf der Suche nach Frauenbekanntschaften. Und da er sich selber für ziemlich langweilig hält, legt er sich für jedes Rendezvous eine neue Identität zu. Und die ändert sich jedes Mal. Da wir aber zu faul sind, ständig neue Objekte von ihm zu erzeugen, legen wir eine "Kopie" von ihm an und ändern nur seine Identität. Das muss man sich so vorstellen.


class Mann
{
  public $identitaet;
  public function __clone()
  {
    $this -> identitaet = clone $this -> identitaet;
  }
}
class NeueIdentitaet
{
  public $fake_name;
  public function __construct()
  {
    $this -> fake_name 'François de Canaille';
  }
  public function __clone() 
  {
    $this -> fake_name 'Francesco di Mafioso';
  }
}
$dieter1 = new Mann();
// Dieter als "Franzose"
$dieter1 -> identitaet = new NeueIdentitaet();
// Dieter als "Italiener"
$dieter2 = clone $dieter1;
print_r($dieter2);

Erläuterung

Dieser Code bedarf einiger Erklärungen. Also zunächst mal erzeugen wir eine Referenz $dieter der Klasse Mann. Sollte nun das Objekt geklont werden, so stellt sein Entwurfsmuster dafür eine Methode bereit. Dabei ist die Eigenschaft identitaet in besagter Klasse nur eine Referenz auf ein neues Objekt. Und die wird mit $dieter1 -> identitaet = new NeueIdentitaet(); erzeugt.

Beim Klonen ($dieter2 = clone $dieter1;) wird nun die entsprechende magische Methode in der Klasse Mann aufgerufen. Und die greift automatisch auf selbige Methode der Klasse NeueIdentitaet zu. Und die verpasst unserem "Helden" eine neue Identität. So wird aus dem zigarettengeschwängertem "Gilbert Bécaud"-Verschnitt ein noch schleimigerer Italiener.

Tschuldigung an alle Franzosen und Italiener. Ich spiele gerne mit Vorurteilen. Ist nicht bös gemeint. Und um eure Frauen beneidet euch ganz Deutschland.

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