#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.