Получить черту из унаследованного класса - PullRequest
0 голосов
/ 13 марта 2019

Я заметил то, что не могу объяснить самому себе. Мне нужна небольшая помощь, чтобы проверить, использует ли унаследованный класс определенную черту. Чтобы было понятнее, я использую следующий код.

trait Foo 
{
    public function say($what) 
    {
        echo $what;
        return $this;
    }
}

class A
{
    uses Foo;
}

class B extends A
{

}

Я знаю, что должен использовать метод class_uses () , чтобы найти все черты, используемые классом. Но это не работает на унаследованных экземплярах.

$b = (new B())->say('hello');

Приведенный выше пример повторяет привет. Таким образом, признак наследуется успешно и может использоваться из класса B.

$used = class_uses($b);
var_dump($used);

Удивительно, но это выводит пустой массив. Я ожидал, что class_uses даст мне что-то вроде Foo. Но это не так.

$reflection = new ReflectionClass('B');
$uses = $reflection->getTraits();
var_dump($uses);

То же самое ожидание здесь. Но он просто выводит пустой массив.

Почему использованную черту из класса A нельзя увидеть в унаследованном классе B? Есть ли альтернативы для решения этой проблемы?

1 Ответ

1 голос
/ 13 марта 2019

class_uses - возвращает черты, используемые данным классом.

Однако вам нужно будет циклически проходить по дереву наследования, чтобы получить все используемые черты, а также каждую черту.

Чтобы получить ВСЕ черты, включая те, которые используются родительскими классами, и другие черты, используйте эту функцию, которую я получил со страницы документации 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); 
}
...