Eine Variable auf eine bestimmte Klasse testen

Wie in PHP ermittelt werden kann, ob eine Variable ein Objekt einer bestimmten Klasse ist

1. Erläuterungen

Um zu bestimmen, ob eine bestimmte Variable ein Objekt einer festgelegten Klasse ist, sind folgende Methoden und Operatoren hilfreich:

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.

PHP-Code
// $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-Code
<?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()) );
?>

HTML-Code: Ausgabe
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-Code
<?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()) );
?>

HTML-Code: Ausgabe
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-Code
<?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()) );
?>

HTML-Code: Ausgabe
Katze: Der Internetliebling! 
Hund: Auch gut! 
Maus: Kein Hund oder Katze uebergeben! 
Fernseher: Kein Hund oder Katze uebergeben! 



Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0