• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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
    )
    

    参见

    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
    ?>
    

    上篇:class_parents()

    下篇:iterator_apply()