Существуют ли чистые виртуальные функции в PHP, как с C

#php #pure-virtual

#php #чисто-виртуальные

Вопрос:

Я бы подумал, что многие люди задались бы вопросом, возможно ли это, но я не могу найти повторяющихся вопросов… исправьте меня.

Я просто хочу знать, предлагает ли PHP чистые виртуальные функции. Я хочу следующее

 class Parent {
   // no implementation given
   public function foo() {
      // nothing 
   }
}

class Child extends Parent {
   public function foo() {
      // implementation of foo goes here
   }
}
  

Большое спасибо.

Ответ №1:

Вы можете создавать абстрактные функции, но вам также нужно объявить родительский класс как абстрактный:

 abstract class Parent {
   // no implementation given
   abstract public function foo();
}

class Child extends Parent {
   public function foo() {
      // implementation of foo goes here
   }
}
  

Комментарии:

1. Для чистой виртуальной функции требуется, чтобы она была определена в подклассе. Если нет, должна возникнуть ошибка. Возникнет ли ошибка, если foo() не определен. Это ключ.

2. Да, если вы расширяете Parent , но не определяете foo , вы получите сообщение об ошибке (если только ваш подкласс не является также абстрактным, и в этом случае он не может быть создан, и любые неабстрактные подклассы должны определять foo себя). Для получения дополнительной информации см. Руководство по PHP , в котором говорится, что «все методы, помеченные как абстрактные в объявлении родительского класса, должны быть определены дочерним элементом».

3. И когда объявляется класс abstract , означает ли это, что все его функции должны быть abstract (то есть pure virtual ), или вы можете создавать виртуальные и конечные функции (я имею в виду функции, не добавляемые с abstract ключевым словом)?

4. @Silidrone Абстрактный класс может иметь абстрактные или конкретные функции. Более подробную информацию см. В документах .

Ответ №2:

Объявите метод как абстрактный в родительском классе:

 abstract public function foo();
  

Ответ №3:

Существуют абстрактные классы!

 abstract class Parent {
   // no implementation given
   abstract public function foo();
   }
}

class Child extends Parent {
   public function foo() {
      // implementation of foo goes here
   }
}
  

Ответ №4:

Да, такой тип решения возможен, он называется полиморфизмом, вы можете сделать это без объявления абстрактного класса или интерфейса.

Комментарии:

1. Создание пустого метода без объявления метода как абстрактного (как в вопросе) не отражает поведение чисто виртуального метода C (что совпадает с абстрактными методами в PHP).

2. Это лучший ответ в мире для чего-либо когда-либо. Я надеюсь, что однажды, когда мои дети вырастут, я смогу показать им этот ответ, и они могут быть впечатлены так же, как я сейчас. Благодаря этому поколения программистов стали лучше, вы, вероятно, в одиночку спасли миллионы жизней здесь — молодец, сэр, молодец. Имейте 1.