是否有任何PHP函数(5.4)习惯性状阵列或相似的:
class myClass extends movingThings {
use bikes, tanks;
__construct() {
echo 'I\'m using the two traits:' . ????; // bikes, tanks
}
}
是否有任何PHP函数(5.4)习惯性状阵列或相似的:
class myClass extends movingThings {
use bikes, tanks;
__construct() {
echo 'I\'m using the two traits:' . ????; // bikes, tanks
}
}
轻松搞定的使用特性,你可以调用class_uses()
$usedTraits = class_uses(MyClass);
// or
$usedTraits = class_uses($myObject);
当可用的功能检查,我一般会建议使用interfaces
。 要添加默认的功能,你可以使用一个接口traits
。 这样你也可以受益于类型提示。
通过实现一个接口强制其对象的功能,然后使用特征来实现默认代码为接口。
class MyClass
implements SomeInterface
{
use SomeTrait;
}
然后你可以通过查看界面;
$myObject = new MyClass();
if ($myObject instanceof SomeInterface) {
//...
}
并仍然使用类型提示;
function someFunction( SomeInterface $object )
{
//...
}
你可以把它写自己,通过使用ReflectionClass
$rc = new ReflectionClass('myClass');
$count = count($rc->getTraits());
只是我的2美分=)
in_array( "CLASS_NAME", class_uses($model) )
或者用PHP> 5.6
in_array( CLASS_NAME::class, class_uses($model) )
class-uses(<class>)
将获得的即时特征<class>
但是它不会被父类或品质等性状的方式获得所有遗传性状...
如果你需要得到绝对的所有继承一个类我建议在阅读这里的官方文档的意见性状:
http://php.net/manual/en/function.class-uses.php
class_uses
和ReflectionClass->getTraits
,如果你想从子类的特征将无法正常工作。
例。
trait A {}
class Mother {
use A;
}
class Child extends Mother {}
var_dump(class_uses('Child')); // empty array
var_dump(class_uses('Mother')); // has A
所以我写了从类得到所有特质简单的代码,我有这个问题。
function all_class_uses($model)
{
$class = new ReflectionClass($model);
$traits = $class->getTraits();
while($parent = $class->getParentClass()) {
$traits += $class->getTraits();
$class = $parent;
}
return array_combine(array_keys($traits), array_keys($traits));
}
我希望这将是有用的(感谢莫里斯的接口使用):
interface IHaveHasTrait { public function has_trait($name); }; trait THaveHasTrait { public function has_trait($name) { $classes = class_parents( $this ); $classes[] = get_class( $this ); foreach( $classes as $class ) { foreach( class_uses( $class ) as $t ) { if( $t === $name ) { return true; } } } return false; } }; trait TLinkedListItem { use THaveHasTrait; public $next; public $prev; }; class A implements IHaveHasTrait { use TLinkedListItem; public $text; public function __construct( $_text ) { $this->text = $_text; } }; class B extends A{}; class C extends B{}; class LinkedList { public function insertItem( &$item, $position=0, $relative=false ) { if( is_a( $item, 'IHaveHasTrait' ) ) { echo $item->has_trait( 'TLinkedListItem' ) ? 'has' : 'not'; } } }; $a = new C('a'); $l = new LinkedList; $l->insertItem($a); ?>
简短的回答:你不应该。 特征是几乎完全复制和粘贴代码。 你不需要知道使用哪些特质,只有性状产生什么。
答案我不想放弃:使用ReflectionClass :: getTraits 。 我不打算详细阐述这一点。