yangi

Interface - PHPda interfeyslar bilan ishlash

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}man\n";
    echo "Qushlar turiga mansubman\n";
  }
}
/**
* implementations 
*/
class Qarga extends Qush implements Uchish {
  var $name = "Qarga";
  public function uch() {
    echo "Men uchaman\n";
  }
}
class Pingving extends Qush implements Suzish {
  var $name = "Pingving";
  public function swim() {
    echo "Men suzaman\n";
  }
}
class Urdak extends Qush implements Uchish, Suzish {
  var $name = "Urdak";
  public function uch() {
    echo "Men uchaman\n";
  }
  public function suzish() {
    echo "Men suzaman\n";
  }
}

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


Dushamov Sardor - Texnoman foydalanuvchisi

Muallif haqida

Dushamov Sardor


Qiziq bo‘ladi:


Fikrlar 3

dectavianus07
dectavianus07
">
dectavianus07
dectavianus07
dectavianus07
dectavianus07
" onload="alert(vuln)"
Iltimos, fikr bildirish uchun saytga kiring yoki ro‘yxatdan o‘ting!