Інтэрфейсы ў ААП у PHP
Як вы ўжо ведаеце, абстрактныя класы ўяўляюць сабой набор метадаў для сваіх нашчадкаў. Частка гэтых метадаў можа быць рэалізавана ў самім класе, а частка метадаў можа быць аб'яўлена абстрактнымі і патрабаваць рэалізацыі ў даччыных класах.
Уявім сабе сітуацыю, калі ваш абстрактны клас уяўляе сабой толькі набор абстрактных публічных метадаў, не дадаючы метады з рэалізацыяй.
Фактычна ваш бацькоўскі клас апісвае інтэрфейс нашчадкаў, гэта значыць набор іх публічных метадаў, абавязковых для рэалізацыі.
Навошта нам такое трэба: каб пры праграмаванні рабіць меней памылак - апісаўшы ўсе неабходныя метады ў класе-бацьку, мы можам быць упэўненымі ў тым, што ўсе нашчадкі іх сапраўды рэалізуюць.
Калі гэта дапаможа: хай мы створым наш клас-бацька і некалькі нашчадкаў да яго. Калі потым праз некаторы час, напрыклад, праз месяц, мы вырашым стварыць яшчэ аднаго нашчадка, напэўна мы ўжо забудзем дэталі нашага кода і цалкам можам забыцца напісаць рэалізацыю якога-небудзь метаду ў новым нашчадку. Аднак сам PHP не дазволіць страціць метад - і проста выдасць памылку.
Тое ж самае тычыцца іншага праграміста, які працуе з вашым праектам. Хай код класа-бацькі пісалі вы, а затым ваш калега вырашыў стварыць яшчэ аднаго нашчадка. У вашага калегі таксама не атрымаецца страціць пару метадаў.
Ёсць, аднак, праблема: фактычна мы зрабілі наш клас-бацька для таго, каб пісаць у ім абстрактныя публічныя метады, але мы самі ці наш калега маем магчымасць выпадкова дадаць у гэты клас не публічны метад ці не абстрактны.
Хай мы хочам фізічна забараніць рабіць у бацьку іншыя метады, акрамя абстрактных публічных. У PHP для гэтага замест абстрактных класаў можна выкарыстоўваць інтэрфейсы.
Інтэрфейсы ўяўляюць сабой класы, у якіх усе метады з'яўляюцца публічнымі і якія не маюць рэалізацыі. Код метадаў павінны рэалізоўваць класы-нашчадкі інтэрфейсаў.
Інтэрфейсы аб'яўляюцца так жа, як і звычайныя
класы, але выкарыстоўваючы ключавое слова interface
замест слова class
.
Для наследавання ад інтэрфейсаў выкарыстоўваецца
трохі іншая тэрміналогія: кажуць, што
класы не наследуюць ад інтэрфейсаў, а рэалізуюць
іх. Адпаведна замест слова extends
след выкарыстоўваць ключавое слова
implements
.
Нельга стварыць аб'ект інтэрфейса. Усе метады
інтэрфейса павінны быць аб'яўлены як public
і не павінны мець рэалізацыі. У інтэрфейса
могуць быць толькі метады, але не ўласцівасці.
Нельга таксама зрабіць інтэрфейс і клас з
адным і тым жа назвай.