Signatur
Beschreibung
class_implements() ermittelt alle Interfaces, die eine Klasse direkt oder indirekt implementiert, sowie alle Interfaces, die ein Interface erweitert. Die Funktion durchsucht dabei die gesamte Vererbungskette und liefert auch Interfaces, die von Elternklassen implementiert wurden.
Der Rückgabewert ist ein assoziatives Array, bei dem sowohl Schlüssel als auch Wert den Interface-Namen enthalten. Das vereinfacht die Prüfung mit isset() im Vergleich zu in_array() erheblich und macht die Suche deutlich performanter.
Der Parameter $autoload steuert, ob der Autoloader aufgerufen werden soll, falls die Klasse noch nicht geladen ist. Dies ist nützlich, wenn man prüfen möchte, ob eine Klasse ein Interface implementiert, ohne sie zwingend vollständig zu instantiieren.
Typische Einsatzgebiete sind Dependency-Injection-Container, Plugin-Systeme und Frameworks, die zur Laufzeit prüfen müssen, ob ein Objekt oder eine Klasse einen bestimmten Vertrag (Interface) erfüllt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $object_or_class Pflicht | object|string | Ein Objekt oder ein Klassenname als Zeichenkette. Bei einem ungültigen Klassennamen wird false zurückgegeben. |
|
| $autoload | bool | true | Gibt an, ob der registrierte __autoload-Mechanismus (bzw. spl_autoload) aufgerufen werden soll, wenn die Klasse noch nicht geladen ist. Bei false wird kein Autoloading ausgelöst. |
Rückgabewert
false zurück, wenn $object_or_class kein gültiger Klassenname ist und Autoloading deaktiviert ist oder die Klasse nicht gefunden werden kann.Beispiele
Alle implementierten Interfaces einer Klasse ermitteln
<?php
interface Serializable {}
interface Loggable {}
interface Auditable extends Loggable {}
class BaseModel implements Serializable {}
class User extends BaseModel implements Auditable {}
$interfaces = class_implements(User::class);
print_r($interfaces);
Prüfen ob eine Klasse ein bestimmtes Interface implementiert
<?php
interface PaymentGateway {
public function charge(float $amount): bool;
}
class StripeGateway implements PaymentGateway {
public function charge(float $amount): bool {
return true;
}
}
function processPayment(string $class): void {
$interfaces = class_implements($class);
if ($interfaces === false || !isset($interfaces[PaymentGateway::class])) {
throw new \InvalidArgumentException(
"$class implementiert das Interface PaymentGateway nicht."
);
}
echo "$class kann als Zahlungs-Gateway verwendet werden.\n";
}
processPayment(StripeGateway::class);
Interfaces eines Objekts abfragen und mit instanceof vergleichen
<?php
interface Countable {}
interface Iterator {}
class MyCollection implements Countable, Iterator {}
$obj = new MyCollection();
// Über ein Objekt statt Klassenname aufrufen
$interfaces = class_implements($obj);
foreach ($interfaces as $interface) {
echo "Implementiert: $interface\n";
}
// Wichtig · Fallstricke
Vererbungskette wird vollständig aufgelöst: Anders als ein einfaches Auslesen der deklarierten Interfaces gibt class_implements() auch alle transitiv implementierten Interfaces zurück, also Interfaces von Elternklassen und Interfaces, die andere Interfaces erweitern.
Unterschied zu instanceof: instanceof prüft zur Laufzeit auf einem Objekt, ob es ein Interface implementiert. class_implements() arbeitet auch auf reinen Klassennamen (Strings), ohne ein Objekt erzeugen zu müssen – das ist in Reflection-Szenarien und Dependency-Injection-Containern nützlich.
Rückgabe bei Interfaces: Wird ein Interface-Name übergeben, liefert die Funktion alle Interfaces, die dieses Interface erweitert – nicht das Interface selbst.
Autoloading beachten: Wird $autoload auf false gesetzt und die Klasse ist noch nicht geladen, gibt die Funktion false zurück, ohne eine Ausnahme zu werfen. Das Ergebnis sollte daher immer mit === false geprüft werden.