PHP static :: DerivedClassName - PullRequest
       6

PHP static :: DerivedClassName

0 голосов
/ 06 октября 2010

Есть ли способ получить производное имя класса из статического ключевого слова? То, что я на самом деле хочу сделать, это.

Создайте отражение производного класса
Проверьте, реализует ли он указанный класс или нет

У меня есть статический метод, который базовый класс назвал своим именем Base::check() Я хочу, чтобы Base::check() проверил наличие реализации интерфейса. метод check () знает имя интерфейса. поэтому мне не нужно извлекать его из внешнего мира.

Но если нет способа получить DerivedClassName из статического ключевого слова, мне нужно передать имя класса в метод из внешнего мира. Что не является хорошим принципом кодирования.

Другая альтернатива, которую я могу сделать, - это. Я могу сделать ::instance() статический метод, который возвращает this, и я могу сделать get_class из его возврата. Но это также изменяет мой принцип применения.

Так действительно ли возможен первый метод? или мне нужно пойти на какую-то альтернативу такого рода? Или у вас есть другие альтернативы?

1 Ответ

2 голосов
/ 06 октября 2010

Я не уверен, что понимаю, что вы пытаетесь сделать, особенно то, что вы подразумеваете под " получить имя производного класса от статического ключевого слова " Проверьте следующие функции, чтобы увидеть, делают ли они то, что вы хотите:

  • class_implements - Возвращает интерфейсы, которые реализованы данным классом
  • class_parents - вернуть родительские классы данного класса
  • is_a - Проверяет, принадлежит ли объект этому классу или имеет этот класс как один из его родителей
  • is_subclass_of - Проверяет, имеет ли объект этот класс как один из его родителей
  • instanceof Тип Оператор

Если вы ссылаетесь на Позднее статическое связывание , взгляните на

  • get_called_class - имя класса «Позднее статическое связывание»

Полагаю, вы пытаетесь сделать что-то вроде этого:

class Base
{
    public static function check()
    {
        return in_array('IFoo', class_implements(get_called_class(), FALSE));
        // or
        $instanceClassName = get_called_class();
        return new $instanceClassName instanceof IFoo;
        // or
        $reflector = new ReflectionClass(get_called_class());
        return $reflector->implementsInterface('IFoo');           
    }
}
interface IFoo {};
class Foo extends Base implements IFoo {}

var_dump( Foo::check() );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...