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

是否 自动加载 如果尚未加载。

返回值

成功时返回一个数组,或 object_or_class 不存在时返回 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
)

参见

添加说明

用户贡献的说明 7 个说明

stealz at op dot pl
11 年前
要获取所有特征,包括父类和其他特征使用的特征,请使用此函数

<?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);
}
?>
Jos Macedo
3 年前
获取所有父特征的另一种方法是

<?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;
}
?>
ulf
11 年前
来自 Stealz 的一个略微修改的版本,它还检查了特征使用的所有“父”特征

<?php
public static function class_uses_deep($class, $autoload = true)
{
$traits = [];

// 获取所有父类的特征
do {
$traits = array_merge(class_uses($class, $autoload), $traits);
} while (
$class = get_parent_class($class));

// 获取所有父特征的特征
$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);
}
?>
Daniel Klein
6 年前
如果类不存在,即使 $autoload == false,您也会收到警告;即,如果找不到类,将 $autoload 设置为 false 不足以消除警告。

这与 class_exists ($class_name, $autoload = true) 不同,后者在两种情况下都不会生成警告。
Daniel Klein
6 年前
我在 ulf 对 stealz 代码的改进基础上进行了改进。我相当确定最后一个“foreach”没有添加任何东西,所以我已经删除了它,并且还添加了对字符串类名的检查(而不是对象),以防止在找不到类时出现警告

<?php
function class_uses_deep($class, $autoload = true) {
$traits = [];

// 获取 $class 及其父类所有 traits
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));

// 获取所有父 traits 的 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);
}
donatj at gmail dot com
3 年前
流行的 stealz 解决方案没有处理使用其他 traits 的 traits。 一点递归可以清理整个东西,使其更加健壮。

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

?>
adam at adamhahn dot com
11 年前
FYI: 没有明确说明,但如果对一个不使用任何 traits 的类运行此函数,它将返回一个空数组。

<?php

class iDontUseTraits {
}

class_uses('iDontUseTraits'); // 返回空数组

?>
To Top