Следует ли использовать отражение или создание экземпляра, чтобы определить, существует ли класс и реализует ли он интерфейс? - PullRequest
2 голосов
/ 12 января 2010

Я хочу определить, существует ли класс и реализует ли он интерфейс. Оба из нижеприведенных должны работать. Что должно быть предпочтительным и почему?

// проверить, существует ли класс, создать его экземпляр и выяснить, реализует ли он аннотацию

  if(class_exists($classname)){
   $tmp=new $classname;
   if($obj instanceof Annotation) {//do something}
  }

// проверяем, существует ли класс, отражаем его и выясняем, реализует ли он аннотацию

  if(class_exists($classname)){
   $r=new  new ReflectionClass($classname);
   if($r->implementsInterface('Annotation)) {//do something}
  }

Ответы [ 4 ]

10 голосов
/ 12 января 2010

Проверьте эти функции

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

Я бы предпочел их классу Reflection для самоанализа класса или его экземпляра. API Reflection предназначен для классов обратного проектирования .

Существует также ряд других пользовательских функций, таких как interface_exists или property_exists , и т. Д. .

1 голос
/ 12 января 2010

Отражение - это безопасный и лучший способ, где вы можете проверить, не создавая объект. Но создание объекта не рекомендуется, если вам не нужен объект, если он не реализует аннотацию, а создание объекта требует больше ресурсов. Использование техники отражения в этом сценарии имеет смысл.

Если вы продолжаете использовать объект, независимо от того, реализует он аннотацию или нет, вы можете создать объект и посмотреть, реализует ли он интерфейс аннотации. Нет лучшего пути, вместо этого вы можете подумать о лучших практиках.

0 голосов
/ 12 января 2010

Это обычный способ. Я также использую этот метод

if(class_exists($classname)){
   $tmp=new $classname;
   if($obj instanceof Annotation) {//do something}
  }
0 голосов
/ 12 января 2010

Использование ReflectionClass является более элегантным способом ИМО. Кроме того, вам не нужно создавать экземпляр класса только для проверки.

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