©
This document uses PHP Chinese website manual Release
(PHP 5 >= 5.4.0)
class_uses — Return the traits used by the given class
$class
[, bool $autoload
= true
] )
This function returns an array with the names of the traits that the
given class
uses. This does however not include
any traits used by a parent class.
class
An object (class instance) or a string (class name).
autoload
Whether to allow this function to load the class automatically through the __autoload() magic method.
An array on success, or FALSE
on error.
Example #1 class_uses() example
<?php
trait foo { }
class bar {
use foo ;
}
print_r ( class_uses (new bar ));
print_r ( class_uses ( 'bar' ));
function __autoload ( $class_name ) {
require_once $class_name . '.php' ;
}
// use __autoload to load the 'not_loaded' class
print_r ( class_uses ( 'not_loaded' , true ));
?>
以上例程的输出类似于:
Array ( [foo] => foo )Array ( [foo] => foo )Array ( [trait_of_not_loaded] => trait_of_not_loaded )
[#1] ulf [2013-07-11 09:21:11]
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);
}
?>
[#2] adam at adamhahn dot com [2013-04-30 23:34:51]
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
?>
[#3] stealz at op dot pl [2012-12-01 10:20:58]
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);
}
?>