2017-09-14 7 views
1

Notez qu'un trait peut utiliser d'autres traits, donc la classe peut ne pas utiliser directement ce trait. Et aussi la classe peut être héritée d'une classe parente qui est celle qui utilise le trait.Comment vérifier si une classe utilise un trait en PHP?

Est-ce une question qui peut être résolue dans plusieurs lignes ou je devrais faire quelques boucles?

+1

Il y a quelques fonctions qui restituera les traits utilisés par une classe (et ses parents/etc) dans les commentaires sur cette page: http://php.net/manual/en/function.class-uses .php – iainn

+0

@iainn. Je pense que ulf fera le travail! – bijiDango

Répondre

2

La fonction class_uses() renverra un tableau contenant les noms de tous les caractères utilisés par cette classe, et fonctionnera en lui transmettant un nom de classe ou une instance .... cependant, vous devrez "recurse" à travers le arbre héritage pour obtenir tous les traits utilisés, et à travers chaque trait ainsi

EDIT

Notez que stealz at op dot pl a fourni une fonction d'exemple montrant comment faire récursion dans la section commentaires de la page PHP Docs liés

+0

Merci monsieur, Aujourd'hui, j'ai appris quelque chose de nouveau +1 –

0

La fonction ci-dessous est de http://php.net/manual/en/function.class-uses.php, le commentaire d'ulf. Fonctionne parfaitement.

function class_uses_deep($class, $autoload = true) 
{ 
    $traits = []; 

    // Get traits of all parent classes 
    do { 
     $traits = array_merge(class_uses($class, $autoload), $traits); 
    } while ($class = get_parent_class($class)); 

    // Get traits of all parent traits 
    $traitsToSearch = $traits; 
    while (!empty($traitsToSearch)) { 
     $newTraits = class_uses(array_pop($traitsToSearch), $autoload); 
     $traits = array_merge($newTraits, $traits); 
     $traitsToSearch = array_merge($newTraits, $traitsToSearch); 
    }; 

    foreach ($traits as $trait => $same) { 
     $traits = array_merge(class_uses($trait, $autoload), $traits); 
    } 

    return array_unique($traits); 
}