class_uses

(PHP 5 >= 5.4.0, PHP 7)

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

Описание

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

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

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

class

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

autoload

В зависимости от переданного значения функция может загрузить описание класса автоматически магическим методом __autoload().

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

В случае успеха будет возвращен массив. В случае ошибки - FALSE.

Примеры

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

<?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';
}

// использование __autoload для загрузки еще незагруженного класса '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() - Returns an array of all declared 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);
}
?>
2012-12-01 12:20:58
http://php5.kiev.ua/manual/ru/function.class-uses.html
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

?>
2013-05-01 02:34:51
http://php5.kiev.ua/manual/ru/function.class-uses.html
Автор:
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);
    }
?>
2013-07-11 12:21:11
http://php5.kiev.ua/manual/ru/function.class-uses.html
Автор:
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.
2018-02-23 02:48:50
http://php5.kiev.ua/manual/ru/function.class-uses.html
Автор:
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);
}
2018-02-23 02:53:15
http://php5.kiev.ua/manual/ru/function.class-uses.html
Автор:
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($traitsclass_uses($parentClass));
    }
   
    return 
$traits;
}
?>
2020-08-16 16:16:17
http://php5.kiev.ua/manual/ru/function.class-uses.html
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_deepstring $classbool $autoload true ) : array {
   
$traits class_uses($class$autoload);

    if(
$parent get_parent_class($class)) {
       
$traits array_merge($traitsclass_uses_deep($parent$autoload));
    }

    foreach( 
$traits as $trait ) {
       
$traits array_merge($traitsclass_uses_deep($trait$autoload));
    }

    return 
$traits;
}

?>
2021-03-15 20:02:30
http://php5.kiev.ua/manual/ru/function.class-uses.html

    Поддержать сайт на родительском проекте КГБ