PHP kennt verschiedene Datentypen, und nicht immer ist auf den ersten Blick klar, ob eine Variable ein Objekt, ein Array oder einen einfachen Skalarwert enthält. Die Funktion is_object() liefert true, wenn die übergebene Variable eine Instanz einer Klasse ist. Besonders bei der Arbeit mit JSON-Daten, dynamischen Konfigurationen oder Legacy-Code ohne Type Hints ist diese Prüfung ein wichtiges Werkzeug.
graph TD
A["Variable pruefen"] --> B{"Ziel?"}
B -->|"Irgendein Objekt"| C["is_object()"]
B -->|"Bestimmte Klasse"| D["instanceof"]
B -->|"Klasse als String"| E["is_a()"]
C --> F["true / false"]
D --> F
E --> F
Wann brauche ich is_object()?
In vielen Situationen kennt PHP den Typ einer Variablen erst zur Laufzeit. Dann ist is_object() die richtige Wahl:
- JSON-APIs:
json_decode() ohne zweiten Parameter liefert Objekte, mit true liefert es Arrays. Wenn du nicht kontrollierst, welcher Modus verwendet wurde, prüfst du mit is_object(). - Legacy-Code: Ältere Projekte ohne Type Hints geben manchmal Objekte, manchmal Arrays zurück. Die Prüfung verhindert Laufzeitfehler.
- Dynamische Konfiguration: Werte aus YAML- oder INI-Dateien können je nach Parser als Objekte oder Arrays ankommen.
- Debugging: Zusammen mit gettype() hilft
is_object() dabei, unbekannte Datenstrukturen zu analysieren.
Grundlegende Verwendung
is_object() gibt true zurück, wenn die Variable eine Objektinstanz ist. Bei allen anderen Typen, einschließlich Arrays und null, liefert sie false:
<?php
$objekt = new stdClass();
$objekt->name = "Test";
$array = ["name" => "Test"];
$text = "Hallo";
$leer = null;
var_dump(is_object($objekt)); // bool(true)
var_dump(is_object($array)); // bool(false)
var_dump(is_object($text)); // bool(false)
var_dump(is_object($leer)); // bool(false)
?>
Auch anonyme Klassen und Closures sind Objekte. Ein is_object()-Aufruf auf eine anonyme Funktion gibt daher ebenfalls true zurück.
Typisches Einsatzgebiet: JSON-Daten absichern
Beim Dekodieren von JSON-Daten entscheidet der zweite Parameter von json_decode(), ob das Ergebnis ein Objekt oder ein assoziatives Array wird. In der Praxis kann man sich nicht immer darauf verlassen:
<?php
$json = '{"name": "Max", "alter": 28}';
$daten = json_decode($json);
if (is_object($daten)) {
echo $daten->name;
} elseif (is_array($daten)) {
echo $daten["name"];
} else {
echo "Ungueltiges JSON-Format.";
}
?>
Dieser Code funktioniert unabhängig davon, ob json_decode() ein Objekt oder Array liefert. So bleibt der Code flexibel und fehlerfrei.
Objekt mit Eigenschaft prüfen
Bevor du auf eine Eigenschaft eines Objekts zugreifst, solltest du sicherstellen, dass die Variable tatsächlich ein Objekt ist und die Eigenschaft existiert:
<?php
function gibEigenschaft(
mixed $daten,
string $eigenschaft
): mixed {
if (is_object($daten)
&& property_exists($daten, $eigenschaft)
) {
return $daten->$eigenschaft;
}
return null;
}
$api = json_decode('{"status": "ok"}');
echo gibEigenschaft($api, "status"); // ok
echo gibEigenschaft("kein Objekt", "x"); // null
?>
Die Kombination aus is_object() und property_exists() verhindert sowohl Typfehler als auch den Zugriff auf nicht vorhandene Eigenschaften.
Unterschied zu instanceof und is_a()
Während is_object() nur prüft, ob eine Variable überhaupt ein Objekt ist, gehen instanceof und is_a() einen Schritt weiter. Sie prüfen, ob das Objekt zu einer bestimmten Klasse oder einem Interface gehört:
<?php
class Tier {}
class Hund extends Tier {}
$rex = new Hund();
/* is_object: Ist es irgendein Objekt? */
var_dump(is_object($rex)); // true
/* instanceof: Ist es ein Hund? */
var_dump($rex instanceof Hund); // true
var_dump($rex instanceof Tier); // true
/* is_a: Wie instanceof, aber
Klassenname als String */
$klasse = "Hund";
var_dump(is_a($rex, $klasse)); // true
?>
instanceof eignet sich für statische Prüfungen, wenn der Klassenname zur Entwicklungszeit bekannt ist. is_a() ist die richtige Wahl, wenn der Klassenname erst zur Laufzeit feststeht, etwa aus einer Konfigurationsdatei oder Datenbank. is_object() beantwortet dagegen nur die grundlegende Frage: Habe ich es überhaupt mit einem Objekt zu tun?
Type Hinting als moderne Alternative
Seit PHP 7.2 gibt es den object Type Hint für Funktionsparameter. Damit übernimmt PHP selbst die Prüfung und wirft einen TypeError, wenn ein falscher Typ übergeben wird:
<?php
function verarbeite(object $daten): string
{
return get_class($daten) . " verarbeitet";
}
echo verarbeite(new stdClass()); // stdClass verarbeitet
/* verarbeite("text"); -> TypeError */
?>
Type Hints sind die sauberere Lösung für eigene Funktionen. is_object() bleibt aber unverzichtbar für dynamische Daten, bei denen der Typ erst zur Laufzeit bekannt ist, etwa bei json_decode() oder dem Auslesen von Cache-Einträgen.
Union Types seit PHP 8.0
Mit PHP 8.0 lassen sich mehrere Typen in einem Parameter kombinieren. Das ist praktisch, wenn eine Funktion sowohl Objekte als auch Arrays akzeptieren soll:
<?php
function toArray(array|object $daten): array
{
if (is_object($daten)) {
return (array) $daten;
}
return $daten;
}
$obj = new stdClass();
$obj->name = "Test";
print_r(toArray($obj));
/* Array ( [name] => Test ) */
print_r(toArray(["name" => "Test"]));
/* Array ( [name] => Test ) */
?>
Auch mit Union Types brauchst du innerhalb der Funktion manchmal noch is_object(), um den genauen Typ zu unterscheiden und entsprechend zu reagieren.
Sonderfall: __PHP_Incomplete_Class
Wird ein serialisiertes Objekt per unserialize() geladen, dessen Klasse nicht mehr existiert, erzeugt PHP ein Objekt vom Typ __PHP_Incomplete_Class. Auch dieses Objekt besteht den is_object()-Test:
<?php
/* Simuliert ein Objekt einer
nicht mehr existierenden Klasse */
$serial = 'O:12:"AlteKlasse":1:{s:4:"name";s:4:"Test";}';
$obj = unserialize($serial);
var_dump(is_object($obj)); // true
var_dump(get_class($obj));
// __PHP_Incomplete_Class
/* Zugriff auf Eigenschaften schlaegt
leise fehl */
var_dump($obj->name ?? "Fehlt"); // Fehlt
?>
Dieses Verhalten tritt häufig auf, wenn Session-Daten Objekte enthalten und die zugehörige Klasse nicht geladen wurde. Am sichersten lässt sich das über den Klassennamen abfangen:
<?php
if (is_object($obj)
&& get_class($obj) !== "__PHP_Incomplete_Class"
) {
/* Objekt ist vollstaendig und nutzbar */
echo $obj->name;
}
?>
Verwandte Funktionen
PHP bietet mehrere Funktionen zur Typprüfung. Je nach Situation ist eine andere die richtige Wahl:
- is_array() prüft, ob eine Variable ein Array ist
- is_string() erkennt Zeichenketten
- gettype() gibt den Typnamen als String zurück
get_class() liefert den Klassennamen eines Objekts instanceof prüft auf eine bestimmte Klasse oder Interface