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);
}
?>class_uses
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
class_uses
Референца за `function.class-uses.php` со подобрена типографија и навигација.
class_uses
(PHP 5 >= 5.4.0, PHP 7, PHP 8)
class_uses — Враќа особини што ги користи дадената класа
= NULL
Оваа функција враќа низа со имињата на особините што ги користи дадената object_or_class ги користи. Ова сепак не вклучува никакви особини што ги користи родителска класа.
Параметри
object_or_class-
Објект (инстанца на класа) или стринг (име на класа).
autoload-
Дали да autoload ако веќе не е вчитан.
Вратени вредности
Низа при успех, или false кога дадената класа не постои.
Примери
Пример #1 class_uses() example
<?php
trait foo { }
class bar {
use foo;
}
print_r(class_uses(new bar));
print_r(class_uses('bar'));
spl_autoload_register();
// use autoloading 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() - Враќа низа од сите декларирани особини
Белешки од корисници 6 белешки
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;
}
?>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);
}
?>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.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);
}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;
}
?>