Start · Sprachen · PHP · Referenz · class_uses

class_uses

Funktion

Gibt ein Array aller Traits zurück, die direkt von einer Klasse oder einem Objekt verwendet werden.

seit PHP 5.4.0 Kategorie: oop

Signatur

class_uses(object|string $object_or_class, bool $autoload = true): array|false

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

Typ
array|false
Beschreibung
Gibt ein assoziatives Array zurück, bei dem Schlüssel und Wert jeweils der Trait-Name (vollqualifiziert) sind. Bei einem Fehler (z. B. Klasse nicht gefunden und Autoload deaktiviert) wird 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);
array(2) { ["Loggable"]=> string(8) "Loggable" ["Serializable"]=> string(12) "Serializable" }

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);
Array ( [HasUuid] => HasUuid [HasTimestamps] => HasTimestamps )

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.';
}
Repository unterstützt Caching.

// 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.