Interface — PHPda interfeyslar bilan ishlash
**Interface**
— sinf qanday metodlarni qo’llashi kerakligini aniqlashga imkon beradi. Agar biror sinfda, qaysidir metodlarni ishlatishni majburiy qilib qo’ymoqchi bo’lsangiz Interface
dan foydalanish mumkin. Interfaceda metodlarning tana qismi bo’lmaydi.
E’lon qilish
interface
kalit so’zi yordamida interfeys hosil qilamiz
interface Avtomobil{ public function bibib():string; public function turnOn(); public function turnOff(); }
Yuqorida Avtomobil nomli interfeys hosil qildik. Avtomobilning quyidagi xususiyatlari mavjud:
- rang berish - rangi qanaqaligini bilish - avtomobilga nom berish - avtomobilni nomini bilish - avtomobilni yoqish - avtomobilni o'chirish Yuqoridagi xususiyatlar barcha avtomobillarda bo`lganligi uchun interface qilib oldik. Endi biror avtomobil ishlab chiqarmoqchi bo`lsak, shu xususiyatlari bo`lishi kerak.
Endi shu interface ni biror sinfga implement qilamiz.
class Bmw implements Avtomobil{ public function getName() { return "Bmw"; } public function bibib():string { return "Bibibbiiib"; } public function turnOn() { echo "{$this->getName()} yoqildi."; } public function turnOff() { echo "{$this->getName()} o'chirildi"; } }
Yana boshqa sinfga ham implement qilamiz
class Tayota implements Avtomobil{ public function getName() { return "Tayota"; } public function bibib():string { return "Viyuvviyuv"; } public function turnOn() { echo "{$this->getName()} yoqildi. n"; } public function turnOff() { echo "{$this->getName()} o'chirildi. n"; } }
Klasga bir nechta interface implement qilish mumkin
interface Uchish { public function uch(); } interface Suzish { public function suz(); } class Qush { public function info() { echo "Men {$this->name}mann"; echo "Qushlar turiga mansubmann"; } } /** * implementations */ class Qarga extends Qush implements Uchish { var $name = "Qarga"; public function uch() { echo "Men uchamann"; } } class Pingving extends Qush implements Suzish { var $name = "Pingving"; public function swim() { echo "Men suzamann"; } } class Urdak extends Qush implements Uchish, Suzish { var $name = "Urdak"; public function uch() { echo "Men uchamann"; } public function suzish() { echo "Men suzamann"; } }
Yana misol:
Faylga yoki bazaga log yozadigan klas hosil qilmoqchimiz.
Bazaga log yozish uchun klas hosil qilamiz:
class LogToDatabase { public function execute($message) { echo 'Bazaga log yozish :' . $message; } }
Faylga log yozish uchun klas hosil qilamiz:
class LogToFile { public function execute($message) { echo 'Faylga log yozish :' . $message; } }
Endi klaslarning metodlaridan foydalanamiz
class MyController { protected $logger; public function __construct(LogToFile $logger) { $this->logger = $logger; } public function show() { $log = 'bu show metod logi'; $this->logger->execute($log); } } $controller = new MyController(new LogToFile); $controller->show(); Natija: Faylga log yozish :bu show metod logi
Yuqoridagi misolda faqat faylga yozyapti. Agar ushbu Logger biz xohlagan paytda faylga yoki biz xohlagan paytda bazaga yozsin desak, yuqoridagi MyController klasini __construct metodini o’zgartirishimiz kerak bo’ladi. Bu MyController klasi LogToFile klasiga bog’liq bo’lib qoldi. Biz bog’liqlikni iloji boricha yo’q qilishimiz kerak. Keling shu jaroyonni interface yordamida hal qilishga harakat qilamiz. Buning uchun Logger nomli interface hosil qilamiz
interface Logger { public function execute(); }
Endi yuqoridagi ikkita klasga shu interface ni implement qilamiz
class LogToDatabase implements Logger { public function execute($message) { echo 'Bazaga log yozish :' . $message; } } class LogToFile implements Logger { public function execute($message) { echo 'Faylga log yozish :' . $message; } }
Endi klasda ishlatamiz
class MyController { protected $logger; // Construktorga endi Interface ni ko'rsatamiz public function __construct(Logger $logger) { $this->logger = $logger; } public function show() { $log = 'bu show metod logi'; $this->logger->execute($log); } } // Agar filega log yozmoqchi bo'lsak: $controller = new MyController(new LogToFile); $controller->show(); // Agar bazaga log yozmoqchi bo'lsak: $controller = new MyController(new LogToDatabase); $controller->show();
Ko’rib turganingizdek biz klaslarning bir biriga bog’liqligini kamaytirdik
Web Dasturlash
Interface — PHPda interfeyslar bilan ishlash