class_uses

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

class_uses Devolver los "traits" usados por la clase dada

Descripción

class_uses(mixed $class, bool $autoload = true): array

Esta función devuelve un array con los nombres de los "traits" que usa la class dada. Sin embargo, esto no incluye ningún "trait" usado por una clase padre.

Parámetros

class

Un objeto (instancia de clase) o una cadena (nombre de clase).

autoload

Si permitir a esta función cargar la clase automáticamente a través del método mágico __autoload().

Valores devueltos

Un array en caso de éxito, o false en caso de error.

Ejemplos

Ejemplo #1 Ejemplo de class_uses()

<?php

trait foo { }
class
bar {
use
foo;
}

print_r(class_uses(new bar));

print_r(class_uses('bar'));

function
__autoload($nombre_clase) {
require_once
$nombre_clase . '.php';
}

// use __autoload para cargar la clase 'no_cargada'
print_r(class_uses('no_cargada', true));
?>

El resultado del ejemplo sería algo similar a:

Array
(
    [foo] => foo
)

Array
(
    [foo] => foo
)

Array
(
    [trait_of_not_loaded] => trait_of_not_loaded
)

Ver también

add a note add a note

User Contributed Notes 7 notes

up
31
stealz at op dot pl
11 years ago
To get ALL traits including those used by parent classes and other traits, use this function:

<?php
function class_uses_deep($class, $autoload = true) {
   
$traits = [];
    do {
       
$traits = array_merge(class_uses($class, $autoload), $traits);
    } while(
$class = get_parent_class($class));
    foreach (
$traits as $trait => $same) {
       
$traits = array_merge(class_uses($trait, $autoload), $traits);
    }
    return
array_unique($traits);
}
?>
up
6
Jos Macedo
3 years ago
Another alternative to get all parent traits is:

<?php
function getUsedTraits($classInstance) {
   
$parentClasses = class_parents($classInstance);
   
$traits = class_uses($classInstance);
   
    foreach (
$parentClasses as $parentClass) {
       
$traits = array_merge($traits, class_uses($parentClass));
    }
   
    return
$traits;
}
?>
up
13
ulf
10 years ago
A slighly modified version from Stealz that also checks all the "parent" traits used by the traits:

<?php
public static 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);
    }
?>
up
1
Daniel Klein
6 years ago
I have improved on ulf's improvement of stealz' code. I'm pretty sure the last "foreach" adds nothing, so I've removed it, as well as adding a check for string class names (as opposed to objects) to prevent the warning if the class is not found:

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

 
// Get all the traits of $class and its parent classes
 
do {
   
$class_name = is_object($class)? get_class($class): $class;
    if (
class_exists($class_name, $autoload)) {
     
$traits = array_merge(class_uses($class, $autoload), $traits);
    }
  } while (
$class = get_parent_class($class));

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

  return
array_unique($traits);
}
up
1
Daniel Klein
6 years ago
If the class does not exist, you will get a warning, even if $autoload == false; I.e., if the class is not found, setting $autoload to false is not sufficient to silence the warning.

This is different from class_exists ($class_name, $autoload = true), which doesn't generate a warning in either case.
up
1
donatj at gmail dot com
3 years ago
The popular stealz solution doesn't handle traits that use other traits. A little bit of recursion can clean the entire thing up a bit and make it more robust.

<?php

public function class_uses_deep( string $class, bool $autoload = true ) : array {
   
$traits = class_uses($class, $autoload);

    if(
$parent = get_parent_class($class)) {
       
$traits = array_merge($traits, class_uses_deep($parent, $autoload));
    }

    foreach(
$traits as $trait ) {
       
$traits = array_merge($traits, class_uses_deep($trait, $autoload));
    }

    return
$traits;
}

?>
up
-43
adam at adamhahn dot com
10 years ago
FYI: It is not explicitly stated, but if you run this function against a class that does not use any traits it will return an empty array.

<?php

class iDontUseTraits {
}

class_uses('iDontUseTraits'); // Returns empty array

?>
To Top