@froosty

Можно ли объявить в абстрактном классе абстрактное свойство (в PHP)?

Доброго времени суток. Недавно на собеседовании столкнулся с вопросом, который мне до сих пор не даёт покоя. Вопрос звучал так: "Можно ли в абстрактном классе объявить абстрактное свойство и если нет, то почему?". Подсознательно понимаю, что нельзя, т.к. это не правильно (наверное). Но не уверен в этом и не могу сформулировать, почему нельзя. Есть у кого какие мысли по этому поводу? Можно ли, и если нельзя, то почему? =)
  • Вопрос задан
  • 3375 просмотров
Пригласить эксперта
Ответы на вопрос 5
kompi
@kompi
nullstack devoops
Это же свойство, оно , если можно так выразиться, - уже реализовано. Т.е. не может быть абстрактным по определению.
PS Это вообще не имеет смысла, так как вся соль в абстракции - описание, без реализации.
Ответ написан
Представь, ты разрабатываешь API для отправки прочты и тебе захотелось по мимо build-in реализация отправки почты (функция mail) реализовать еще несколько вариантов, например использовать сервис Mailgun. API ты конечно же разрабатываеть, чтоб им пользовались другие разработчики, и ты прекрасно понимаешь, что сторонний разработчик может захотеть отправлять и через другие сервисы, например тот же mailchimp. Твоя задача предоставить понятный "интерфейс" стороним разработчикам. Например каждый новый provider должен реализовать методы setSubject, setBody, send, к ним аргументы, а так же ты указываешь в документации, что должны возвращать эти методы. Все, ты подготовил "интерфейс". Теперь я реализую его. Какие я там буду создавать свойства - это уже не касается интерфейса. Да хоть global variable использовать, это уже не его дело. Вот и подумай, нужны ли вообще абстрактные свойства
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
PHP Fatal error: Properties cannot be declared abstract in
Ответ написан
Ridzhi
@Ridzhi
На вершине пищевой цепочки
На ответ почему, я бы ответил что свойства класса могут принимать значения только элементарных типов данных и не могут иметь реализации в виде функции как таковой.
Ответ написан
HaJIuBauKa
@HaJIuBauKa
А какая причина объявлять его абстрактным, то есть не реализованным? Оно просто не может являться таковым по определению.
Свойство есть элементарный элемент - описание класса. Абстрактный метод - это метод который должен быть реализован в потомках. В абстрактном классе он не имеет реализации (тела). Абстрактный класс - это класс для которого нельзя создать экземпляр, можно наследоваться от него и реализовать.
Обычно используют интерфейсы для абстрактных базовых классов, в которых описывают методы и свойства. Классы потомки наследуют эти свойства, реализуют методы - это упрощает описание классов и стандартизирует их структурное направление.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы