1. Erläuterungen
Um zu bestimmen, ob eine bestimmte Variable ein Objekt einer festgelegten Klasse ist, sind folgende Methoden und Operatoren hilfreich:
- $var instanceof Beispielklasse: Der Operator „instanceof” ergibt true, wenn die Variable $var ein Objekt der angegebenen Klasse (hier: „Beispielklasse”) ist.
- get_class($var): Gibt den Namen der Klasse von $var zurück, welcher sich mit dem gewünschten Klassennamen vergleichen lässt.
- is_object($var): Prüft, ob die Variable $var ein Objekt ist.
Zudem können für Parameter von Funktionen direkt die erwarteten Klassen vorgegeben werden. Sollte dann einmal eine Variable einer anderen Klasse übergeben werden, wird automatisch ein Fehler erzeugt.
// $var muss ein Objekt der Klasse Beispielklasse sein // (Auch Klassen, die von "Beispielklasse" ableiten sind erlaubt.) function foo(Beispielklasse $var) { // ... }
2. Beispiele
2.1. instanceof
In diesem Beispiel wird eine kurze Funktion namens „bewerteTier($obj)” geschrieben, die ein übergebenes Tier bewertet. Dazu wird eine Klasse „Tier” erstellt von der die Klassen „Katze”, „Hund” und ”Maus” ableiten. Die Funktion hat nur Bewertungen zu den Klassen „Katze” und „Hund”, daher gibt sie pauschal zu allen anderen Tieren nur die Meldung „Unbekanntes Tier übergeben” zurück. Wird kein Tier übergeben, dann beklagt sich die Funktion mit dem Fehler „Kein Tier übergeben”.
<?php class Tier { } class Katze extends Tier { } class Hund extends Tier { } class Maus extends Tier { } class Fernseher { } function bewerteTier($obj) { if ($obj instanceof Katze) { return "Der Internetliebling! \n"; } else if ($obj instanceof Hund) { return "Auch gut! \n"; } else if ($obj instanceof Tier) { return "Unbekanntes Tier uebergeben. \n"; } else { return "Kein Tier uebergeben! \n"; } } echo( 'Katze: ' . bewerteTier(new Katze()) ); echo( 'Hund: ' .bewerteTier(new Hund()) ); echo( 'Maus: ' .bewerteTier(new Maus()) ); echo( 'Fernseher: ' .bewerteTier(new Fernseher()) ); ?>
Katze: Der Internetliebling! Hund: Auch gut! Maus: Unbekanntes Tier uebergeben. Fernseher: Kein Tier uebergeben!
2.2. Prüfung direkt im Funktionskopf
Das nachfolgende Beispiel ist identisch zum vorherigen. Jetzt wird allerdings bereits von der Funktion vorgeschrieben, dass nur Tiere übergeben werden sollen (siehe: bewerteTier(Tier $obj)). Bei Erreichen des Fernsehers wird daher ein PHP-Fehler erzeugt.
<?php class Tier { } class Katze extends Tier { } class Hund extends Tier { } class Maus extends Tier { } class Fernseher { } // $obj muss die Klasse Tier haben // Achtung: Im Gegensatz zu Java ist keine Überladung möglich, es darf also // nur eine Funktion mit Namen bewerteTier geben. // bewerteTier(Hund $obj) und _gleichzeitig_ bewerteTier(Katze $obj) sind zum Beispiel nicht möglich, // nur eine von beiden ist erlaubt. function bewerteTier(Tier $obj) { if ($obj instanceof Katze) { return "Der Internetliebling! \n"; } else if ($obj instanceof Hund) { return "Auch gut! \n"; } else if ($obj instanceof Tier) { return "Unbekanntes Tier uebergeben. \n"; } else { return "Kein Tier uebergeben! \n"; } } echo( 'Katze: ' . bewerteTier(new Katze()) ); echo( 'Hund: ' .bewerteTier(new Hund()) ); echo( 'Maus: ' .bewerteTier(new Maus()) ); echo( 'Fernseher: ' .bewerteTier(new Fernseher()) ); ?>
Katze: Der Internetliebling! Hund: Auch gut! Maus: Unbekanntes Tier uebergeben. <br /> <b>Catchable fatal error</b>: Argument 1 passed to bewerteTier() must be an instance of Tier, instance of Fernseher given, called in ...\test.php on line 28 and defined in <b>...\test.php</b> on line <b>13</b><br />
2.3. Prüfung mit get_class()
Wieder das selbe Beispiel, diesmal wird aber mit get_class() geprüft. Die Überprüfung mit get_class() ist weniger flexibel als instanceof. Während instanceof auch auf Elternklassen prüft (zum Beispiel ist bei „Hund” die Elternklasse „Tier”) ist dies bei get_class() nicht möglich. Daher ist das Ergebnis der Funktion hier abgewandelt und gibt nicht mehr eine passende Fehlermeldung zurück, wenn ein unbekanntes Tier übergeben wird.
<?php class Tier { } class Katze extends Tier { } class Hund extends Tier { } class Maus extends Tier { } class Fernseher { } function bewerteTier($obj) { if (!is_object($obj)) { echo("Kein Objekt uebergeben! \n"); } else { if (get_class($obj) === 'Katze') { return "Der Internetliebling! \n"; } else if (get_class($obj) === 'Hund') { return "Auch gut! \n"; } else { return "Kein Hund oder Katze uebergeben! \n"; } } } echo( 'Katze: ' . bewerteTier(new Katze()) ); echo( 'Hund: ' .bewerteTier(new Hund()) ); echo( 'Maus: ' .bewerteTier(new Maus()) ); echo( 'Fernseher: ' .bewerteTier(new Fernseher()) ); ?>
Katze: Der Internetliebling! Hund: Auch gut! Maus: Kein Hund oder Katze uebergeben! Fernseher: Kein Hund oder Katze uebergeben!