SELFPHP

SELFPHP-Druckversion
Original Adresse dieser Seite:
http://www.selfphp.de/praxisbuch/praxisbuchseite.php?site=254&group=44
© 2001-2017 E-Mail SELFPHP OHG, info@selfphp.de
© 2005-2017 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de


Dereferenzierung von Objekten


Bei der Dereferenzierung von Objekten ist es grundsätzlich möglich, aus einer Funktion heraus ein Objekt zurückzugeben, welches ohne Instanz auskommt und trotzdem den Aufruf von Klassenmethoden des zurückgegebenen Objekts im globalen Namensraum erlaubt.


Funktionsweise der Dereferenzierung von Objekten

Um ein Objekt anzusprechen, welches die Instanz eines anderen Objekts ist, war bislang ein Zwischenschritt über eine temporäre Variable notwendig. Mit PHP 5 lässt sich der gesuchte Name mit einem einzigen Ausdruck und ohne Umwege ermitteln.

Beispiel

<?php

// Klassendefinition
class Person
{
  var $Name;
  var $Vater;
  var $Mutter;

  function __construct($wert){
    $this->Name = $wert;
  }
}

// Verwandtschaftliche Beziehungen definieren
$objOpa = new Person('Armin');
$objVater = new Person('Wendelinus');
$objVater->Vater = $objOpa;
$objMatze = new Person('Matze');
$objMatze->Vater = $objVater;

// Name von Matthias Opa – PHP 4-Variante
$objTemp1 = $objMatze->Vater;
$objTemp2 = $objTemp1->Vater;
echo "Matzes Opa heisst " . $objTemp2->Name;

// PHP 5 mit Objekt-Dereferenzierung
echo "Matzes Opa heisst " . $objMatze->Vater->Vater->Name;
?>

Diese Verknüpfungskette, an der man sich von einem Objekt zum nächsten entlangbewegt, mag unnötig aufgebläht erscheinen. Sie müssen sich dabei jedoch immer vor Augen halten, dass Sie somit auf temporäre Variablen verzichten können und dass bei vernünftiger Objektmodellierung der Code dabei auch die echten Beziehungen der Objekte untereinander ausdrückt. So kann der Ausdruck $objMatze->Vater->Vater->Name wie folgt übersetzt werden: »von Matzes Vater, der Vater, der Name«. Bei der auf PHP 4 basierenden Variante muss man schon genauer hinsehen, um die Beziehungen zu erkennen.

Das Prinzip funktioniert nicht nur mit Instanzvariablen, sondern auch mit Methoden – sofern diese Objektreferenzen als Rückgabewert liefern. Damit sind Konstrukte möglich wie:
objKleiderSammllung->getHochzeitsKleid()->strFarbe;
"Das Hochzeits Kleid hat die Farbe..."

Beispiel – Vertiefung Objekt-Dereferenzierung

<?php

class PKW
{
  protected $name = "";
  
  function __construct($typ)
  {
    $this->name = $typ;
  }
  
  function Bauen()
  {
    echo $this->name . " bauen\n";
  }
}

class Motorrad
{
  protected $name = "";
  
  function __construct($typ)
  {
    $this->name = $typ;
  }
  
  function Bauen()
  {
    echo $this->name . " bauen\n";
  }
}

function Produzieren($obj, $name)
{
  switch ($obj)
  {
    case "PKW":
      return new PKW($name);
    case "Motorrad":
      return new Motorrad($name);
  }
  return new PKW($name);
}

Produzieren("PKW", "Mini")->Bauen();
Produzieren("Motorrad", "Kawasaki")->Bauen();

?>

Ausgabe
Mini bauen
Kawasaki bauen