Signatur
Beschreibung
class_uses() ermittelt alle Traits, die direkt in einer Klasse definiert (eingebunden) sind, und gibt deren Namen als assoziatives Array zurück, bei dem Schlüssel und Wert jeweils der Trait-Name sind.
Wichtig: Die Funktion liefert nur die Traits der angegebenen Klasse selbst – nicht die Traits von Elternklassen. Um alle verwendeten Traits inklusive der Vererbungshierarchie zu ermitteln, muss man class_uses() rekursiv über class_parents() aufrufen.
Mit dem optionalen Parameter $autoload lässt sich steuern, ob der Autoloader aktiviert werden soll, wenn die Klasse noch nicht geladen ist. Das ist nützlich, wenn man prüfen möchte, ob eine Klasse existiert, ohne einen Autoload-Fehler zu riskieren.
Die Funktion ist besonders hilfreich in Frameworks und Dependency-Injection-Containern, die zur Laufzeit prüfen müssen, welche Fähigkeiten (Traits) eine Klasse mitbringt, ohne teure Reflection-Operationen durchzuführen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $object_or_class Pflicht | object|string | Ein Objekt oder der Klassenname als string, dessen verwendete Traits ermittelt werden sollen. |
|
| $autoload | bool | true | Gibt an, ob der Autoloader aufgerufen werden soll, falls die Klasse noch nicht geladen wurde. Standardmäßig true. |
Rückgabewert
false zurückgegeben.Beispiele
Traits einer Klasse ermitteln
<?php
trait Loggable {
public function log(string $msg): void {
echo "[LOG] $msg\n";
}
}
trait Serializable {
public function serialize(): string {
return json_encode($this);
}
}
class User {
use Loggable, Serializable;
}
$traits = class_uses(User::class);
var_dump($traits);
Alle Traits inklusive Elternklassen ermitteln
<?php
trait HasTimestamps {
public string $createdAt = '';
}
trait HasUuid {
public string $uuid = '';
}
class BaseModel {
use HasTimestamps;
}
class Post extends BaseModel {
use HasUuid;
}
/**
* Gibt alle Traits einer Klasse und ihrer Elternklassen zurück.
*/
function class_uses_recursive(string $class): array {
$traits = class_uses($class) ?: [];
foreach (class_parents($class) as $parent) {
$traits += class_uses_recursive($parent);
}
return $traits;
}
$allTraits = class_uses_recursive(Post::class);
print_r($allTraits);
Prüfen ob eine Klasse einen bestimmten Trait verwendet
<?php
trait Cacheable {}
class ProductRepository {
use Cacheable;
}
$repo = new ProductRepository();
if (isset(class_uses($repo)[Cacheable::class])) {
echo 'Repository unterstützt Caching.';
} else {
echo 'Kein Caching verfügbar.';
}
// Wichtig · Fallstricke
Achtung: class_uses() gibt nur die direkt in der angegebenen Klasse verwendeten Traits zurück. Traits, die über Elternklassen eingebunden wurden, werden nicht berücksichtigt. Für eine vollständige Übersicht muss man die Vererbungshierarchie manuell traversieren (siehe zweites Beispiel).
Traits, die innerhalb eines Traits verwendet werden (Trait-Komposition), werden ebenfalls nicht direkt aufgelistet – auch hier ist eine rekursive Lösung nötig.
Bei nicht existierenden Klassen und deaktiviertem Autoload ($autoload = false) gibt die Funktion false zurück, was ein explizites Prüfen des Rückgabewerts empfiehlt.