PHP: Interfeisi un abstraktās klases

Par interfeisu PHP valodā varētu uzskatīt ļoti abstraktu objektu, kurā definētas obligātās procedūras, bet nav norādīts, ko tām procedūrām jādara. Interfeisa īpatnība ir tā, ka ja procedūra definēta, tad tai obligāti jābūt aprakstītai klasē. Interfeisus var kombinēt, t.i. norādīt vairākus un pat paplašināt (extend).

Lielākoties ar abreviatūru OOP saprot klašu lietošanu. Reizē tas kalpo arī kā izolators funkcijām un mainīgiem. OOP un vispār programmēšanas „Svētais Grāls” ir iespēja atkārtoti izmantot vienreiz sarakstīto kodu un tuvošanos šim svētajam Grālam varētu simboliski apzīmēt ar iespēju izmantot koda fragmentus tā, lai individuālā uzdevuma realizēšanai atliktu tikai „pielabot” dažas rindiņas. Principā, OOP gadījumā to var panākt ar objektu (klašu) paplašināšanu (eng. Extend).

class Dzivnieks {
  public function barot() {
    echo „ēd zāli”;
  }
}

class Lauva extends Dzivnieks {
  public function elpot() {
    echo „elpo”;
  }
}

Līdz ar ko klase Lauva manto funkciju barot() un definē jaunu elpot().

Var rasties dažas problēmas:

1. Gadījumā, ja objektu (klasi) vai funkciju raksta dažādi programmētāji, kā nonākt pie vienota standarta, kā saukt funkcijas (provedūras) un kādām funkcijām vispār ir jābūt?
2. Kādam jābūt obligāto funkciju klāstam?
3. Kā novērst un rīkoties situācijās, kad vairākkārtēji paplašinot objektu nav īsti saprotams un kura objekta funkcija tiek izpildīta?

Interfeisi un Abstraktās klases.

Interfeiss, kā varētu domāt, ir kaut kāds instrumentu kopums, kas paredzēts, lai veidotu saikni ar vai starp objektu. Kļūdaini varētu nodomāt, ka Interfeisi ir saskarnes ar ārējiem objektiem. Tas tā nav.
Lasot PHP dokumentāciju varētu arī nebūt uzreiz skaidras interfeisu lietošanas priekšrocības. Līdz ar ko mēģināšu izstāstīt, kā esmu pats to sapratis.
Principā, par interfeisu PHP valodā varētu uzskatīt ļoti abstraktu objektu, kurā definētas obligātās procedūras, bet nav norādīts, ko tām procedūrām jādara. Interfeisa īpatnība ir tā, ka ja procedūra definēta, tad tai obligāti jābūt aprakstītai klasē. Interfeisus var kombinēt, t.i. norādīt vairākus un pat paplašināt (extend).

Daži piemēri:

#1.
interface PageInterface
{
  public function render();
} 

#2a.
class Login implements PageInterface
{
  public function render()
  {
   return 'Render Login Page';
  }
} 

#2b.
class Register implements PageInterface
{
  public function render()
  {
   return 'Render Register Page';
  }
} 

#3.
class PageCollection
{
  private $pPage = array();

  public function add(PageInterface $pPage)
  {
   $this->m_aPageCollection[] = $pPage;
  }

  public function renderPages()
  {
   foreach ($this->m_aPageCollection as $pPage)
   {
     echo $pPage->render();
   }
  }
} 

#4.
$pPageCollection = new PageCollection();
$pPageCollection->add(new Login());
$pPageCollection->add(new Register());
$pPageCollection->renderPages(); 

Intefeisu kombinēšana:

#5.
interface AdminPageInterface
{
  public function auth();
}

class AdminNews implements PageInterface, AdminPageInterface
{
  public function auth()
  {
    echo "Auth Code";
  }

  public function render()
  {
    echo "Render Code";
  }
} 


Visos objektos (klasēs) kurās izmanto interfeisu PageInterface obligāti jābūt funkcijai render(). Kā redzam ilustrācijās #3 un #4 obligāts funkcijas renderē() lietojums noved pie tā, ka objektu PageCollection var veidot ļoti universālu neskatoties uz to, ka objektus Login (#2a.) un Register (#2b.) var veidot dažādi cilvēki.

Abstraktās klases ir nedaudz universālāks veidojums. Darbojas līdzīgi kā interfeisi, tikai ir iespējams definēt arī funkcijas ar kodu.

Protams, „umņiki” varētu iebilst, ka interfeisi un abstraktās klases darbojas atšķirīgi, tomēr ceru, ka ieviesu zināmu skaidrību kā lietojami interfeisi. :)

http://www.killerphp.com/articles/php-interfaces/
http://www.talkphp.com/advanced-php-programming/1446-working-interfaces.html

 

Dalies:
Novērtē: 5 (1)
Skatīts: 2071

komentāri

grostons

Oho! Visu lauku domāju, ka interfeiss ir tad ja funkcijā pirms mainīgā raksta. funkcija acl(Zend_Acl $event)

Пупкин

Класс - это набор готовых или не совсем готовых (абстрактных) методов, и различных переменных.
Обьект (экземпляр) класса - это тот же самый класс (набор методов, переменных и тд), только в качестве ссылки на него (можно вызывать методы, переменные, и тд).



Ko lasa citi?