SELFPHP

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


Typen-Hinweise (class type hints)


PHP ist eine schwach typisierte Sprache und verfügt über keine strikte Typisierung. PHP legt intern fest, welchen Datentyp eine Variable annimmt oder eine Funktion zurückgibt. Es gibt zwar die bereits behandelten Umwandlungsfunktionen, letztlich besteht aber kein Typzwang, wie dies in Programmiersprachen üblich ist. Anstatt auf eine strikte Typisierung kann jedoch auf einen klassenbasierten Typen-Hinweise (engl. type hints) zugegriffen werden. Dieser Typen-Hinweis wird zur Laufzeit ausgewertet. Damit kann festgelegt werden, dass an Methoden nur Objekte einer bestimmten Klasse übergeben werden können.


Funktionsweise von Typen-Hinweisen

Die Forderungen an den Typ eines Parameters können durch die Angabe eines Klassen- oder Schnittstellennamens in der Signatur der Methode erfolgen. Die Typenprüfung erfolgt jedoch nicht zum Zeitpunkt der Kompilierung, sondern erst zur Laufzeit. Diese sogenannten Class Type Hints ersparen dem Entwickler einiges an Schreibarbeit, wie die beiden folgenden Beispiele zeigen.

Beispiel – Class Type Hints

<?php

interface Reinlassen
{
  function Zutrittgestatten();
}

class Vipzone implements Reinlassen
{
  function Zutrittgestatten()
  {
    echo "VIP Bereich.\n";
  }
}

class Normalzone implements Reinlassen
{
  function Zutrittgestatten()
  {
    echo "Öffentlicher Bereich.\n";
  }
}

class Privatperson
{
  function Betreten(Normalzone $ticket)
  {
    echo $ticket->Zutrittgestatten();
  }
}

class Vipperson
{
  function Betreten(Reinlassen $ticket)
  {
    echo $ticket->Zutrittgestatten();
  }
}

$vip = new Vipperson();
echo "VIP-Person Zutritt zu:\n";
$vip->Betreten(new Normalzone);
$vip->Betreten(new Vipzone);

$normalperson = new Privatperson();
echo "Normal-Person Zutritt:\n";
$normalperson->Betreten(new Normalzone);
$normalperson->Betreten(new Vipzone);

?>

Ausgabe
VIP-Person Zutritt zu:
Öffentlicher Bereich.
VIP Bereich.
Normal-Person Zutritt:
Öffentlicher Bereich.

Fatal error: Argument 1 passed to Privatperson::Betreten() must be an instance of Normalzone

Wie man an diesem Beispiel sieht, kann das Objekt $normalperson nur den öffentlichen Bereich betreten, während es beim Objekt $vip egal ist, welcher Bereich betreten wird. Die Angabe von function Betreten(Normalzone $ticket) entspricht:

function Betreten($ticket)
{  
  if (!($ticket instanceof Normalzone))
  {
    die("Argument 1 must be an instanc of vipzone");
  }
  echo $ticket->Zutrittgestatten();
}
{PSP}Ausgabe
VIP-Person Zutritt zu:
Öffentlicher Bereich.
VIP Bereich.
Normal-Person Zutritt:
Öffentlicher Bereich.
Argument 1 must be an instanc of Vipzone

Beispiel – Typprüfung mit Class Type Hints

<?php

class Rechnung {
  function berechne(Rechnung $rechnung) {
    // ...
  }
}

?>

Beispiel – Typprüfung mit dem instanceof-Operator

<?php
class Rechnung {
  function berechne($rechnung) {
    if (!($rechnung instanceof Rechnung)) {
      die('Parameter muss vom Typ Rechnung sein.');
    }
    // ...
  }
}
?>

Hinweis: Diese beiden Beispiele unterscheiden sich lediglich in der Art der Typprüfung durch die Class Type Hints bzw. den instanceof-Operator.