class_uses()
(PHP 5 >= 5.4.0, PHP 7)
Return the traits used by the given class
说明
class_uses(mixed $class[,bool $autoload= TRUE
]): array
This function returns an array with the names of the traits that the given$classuses. 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.
范例
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 )
参见
class_parents()
返回指定类的父类。get_declared_traits()
返回所有已定义的 traits 的数组
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); } ?>
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.
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); } ?>
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); }
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 ?>