PHP 8.6.0 Beta 1 is available for testing

class_uses

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

class_uses Возвращает список трейтов, используемых заданным классом

Описание

function class_uses(object |string $object_or_class, bool $autoload = true ): array |false

Эта функция возвращает массив с именами трейтов, которые использует заданный класс object_or_class. В этот массив, однако, не попадут трейты, используемые в классах-родителях.

Список параметров

object_or_class

Объект (экземпляр класса) или строка (имя класса).

autoload

Нужно ли автоматически подгружать класс, если он ещё не загружен.

Возвращаемые значения

В случае успешного выполнения будет возвращён массив, если заданный класс не существует, возвращается false .

Примеры

Пример #1 Пример использования class_uses()

<?php
trait foo { }
class bar {
 use foo;
}
print_r(class_uses(new bar));
print_r(class_uses('bar'));
spl_autoload_register();
// использование автозагрузки для загрузки ещё незагруженного класса 'not_loaded'
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 notes

up
37
stealz at op dot pl
13 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
8
Jos Macedo
5 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
17
ulf
13 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
4
Daniel Klein
8 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
4
Daniel Klein
8 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
0
donatj at gmail dot com
5 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;
}
?>
+Добавить

AltStyle によって変換されたページ (->オリジナル) /