class_uses

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

class_uses 指定したクラスが使っているトレイトを返す

説明

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
)

参考

add a note

User Contributed Notes 6 notes

up
35
stealz at op dot pl
12 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
4 years ago
Another alternative to get all parent traits is:<?phpfunction 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
12 years ago
A slighly modified version from Stealz that also checks all the "parent" traits used by the traits:<?phppublic 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
7 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
7 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:<?phpfunction 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
4 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.<?phppublic 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;}?>
To Top