Pereiti prie turinio

Rekomenduojami pranešimai

Bandau perprasti PHP interfeisus, tačiau niekaip neįžvelgiu pliusų. Na galbūt vienas pliusas būtų tai, kad tu nurodai funkcijas, kurias bus privaloma apsirašyti naujai kuriamose klasėse. Tačiau lygiai tą patį galima realizuoti su abstrakčiose klasėse. Plius abstrakčioje klasėje visuomet galėsi įdėti bendrą funkciją, kurios nereiks perašinėti.

 

 

 

Pavizdys su interfeisu:

 

interface Login {
   public function login();
}

class FacebookLogin implements Login {
   public function login() {
       return 'User logged into Facebook';
   }
}

class TwitterLogin implements Login {
   public function login() {
       return 'User logged into Twitter';
   }
}

class UserLogin {
   private $loginINF;

   public function __construct($instance) {
       $this->loginINF = $instance;
   }

   public function login() {
       return $this->loginINF->login();
   }
}

$UserLogin = new UserLogin(new FacebookLogin);
echo $UserLogin->login();

 

 

Tas pats pavizdys su abstrakčia klase:

 

abstract class Logger {
   abstract public function login();
}

class FacebookLogin extends Logger {
   public function login() {
       return 'User logged into Facebook';
   }
}

class TwitterLogin extends Logger {
   public function login() {
       return 'User logged into Twitter';
   }
}

class UserLogin {
   private $loginINF;

   public function __construct($instance) {
       $this->loginINF = $instance;
   }

   public function login() {
       return $this->loginINF->login();
   }
}

$UserLogin = new FacebookLogin();
echo $UserLogin->login();

 

Ir panašiai galima realizuoti su paprastom klasėm.

 

<?php

class FacebookLogin {
   public function login() {
       return 'User logged into Facebook';
   }
}

class TwitterLogin {
   public function login() {
       return 'User logged into Twitter';
   }
}

class LoginWrapper {
   private $loginINF;

   public function __construct($instance) {
       $this->loginINF = $instance;
   }

   public function login() {
       return $this->loginINF->login();
   }
}

$LoginWrapper = new LoginWrapper(new TwitterLogin);
echo $LoginWrapper->login();

 

O gal kažko dar nesuprantu?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tu esi teisus, galima naudoti abu atvejus, bet yra keletas skirtumu tarp abstract class ir interface.

 

* Tu gali extendint tik viena abstrakcia klase, o implementuoti keleta interface

* Interface neleidzia praplesti klases savais metodais

 

Mano pasiulymas naudoti interface tik tada kai nori pazymeti klase, kaip kazkoki specifini tipa. Kaip pvz PHP turi keleta labai naudingu interface:

http://php.net/manual/en/class.arrayaccess.php

http://php.net/manual/en/class.arrayobject.php

 

+ Naudojant interface yra patogu patikrinti ar klase turi atitinkama tipa su instanceof

 

O visais kitais atvejais siulau naudoti abstrakcia klasia.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ant PHP klasės ir interface'ai neturi didelės prasmės, nes kaip pavaizduota autoriaus 3 pavyzdyje, galima tiesiog padaryti 2 atskiras klasės su tais pačiais metodais. Bet normaliose kalbose tai neveiks.

 

Abstrakti klasė, kaip ir normali klasė, nusako, kas yra tam tikras objektas. Tuo tarpu interface'as nusako, objektas gali daryti. Tai gerai ataispindi ir autoriaus pavyzdžiuose: interface'as pavadintas "Login", o klasė "Logger".

 

Pavyzdyje su prisjungimais tinkamas tiek interface'as, tiek abstrakti klasė. Klasė gal netgi labiau, nes joje gali įsidėti kokių pagalbinių protected metodų (tarkim, patikrinti, ar paduotas taisyklingas el. pašto adresas). Interface'as būtų naudingesnis tokiu atvejų, kai keletas visiškai nepanašių klasių turėtų sugebėti atlikti tą patį veiksmą. Pavyzdžiui,

interface Closeable {
 void close();
}

Šį interface'ą galėtum panaudoti įvairiose vietose: uždaryti failą, į kurį rašai duomenis, uždaryti HTTP prisijungimą pabaigus failo parsisiunutimą, uždaryti susijungimą su DB. Šiuo atveju klasė netiktų, nes HTTP susijungimas, DB susijungimas ir failo rašymas yra mažai susiję dalykai (apart to, kad visus reikia uždaryti).

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...