簡體   English   中英

如何在php-class中使用traits?

[英]how to get used traits in php-class?

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_usesReflectionClass->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));
}

我希望這會有用(感謝Maurice的界面使用):

    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 我不打算詳細說明這個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM