PHPPamokos.lt


8. Interfeisai

Iki šiol jau išmokome tris OOP "lygius" - galima sukurti klasę, tos klasės "dukterinę" klasę, ir tada klasės objektą. O ką jeigu jums pasakysiu, kad yra dar vienas, ketvirtas lygis? Tai interfeisai.

Kai kuriame klasę, apibrėžiame metodus ir jų veikimą. Interfeisai savo ruožtu yra beveik kaip klasės, tik jie turi tik metodų apibrėžimus. Kitaip tariant, juose nurodoma, kokie metodai bus klasėje ir kokie jų parametrai, bet visiškai nieko neužsimenama apie tai, kaip būtent tie metodai veiks.

Tai ir yra vienas papildomas lygis, kuris yra aukščiau klasių - klasė gali būti kuriama, įvykdydama ("implement") vieną iš anksčiau sukurtų interfeisų.

Pereikime prie kodo pavyzdžio:

interface DB {

	public function get($table);

	public function getWhere($table, $where);

}

class MySQL implements DB {
	
	public function get($table) {
		// ... select * from $table
	}

	public function getWhere($table, $where) {
		// ... select * from $table $where
	}

}

Kaip matote, interfeisas apibrėžia, kokie metodai bus klasėje, jis veikia kaip klasės išankstinis planas, kurį pati klasė vėliau stropiai seka ir vykdo. Kartais programavimo pasaulyje interfeisai dar vadinami "kontraktais".

Vėliau, kuriant klasę, pažymima, kad jį realizuoja būtent DB interfeisą (atkreipkite dėmesį - implements DB, ne extends kaip dukterinėse klasėse).

Šiuo konkrečiu atveju prasmė yra tokia: kuriame interfeisą darbui su duomenų baze, kuriame nurodome, kokius metodus turi turėti kiekviena klasė, realizuojanti šį interfeisą - šiame pavyzdyje parodyta klasė MySQL, bet ateityje gali atsirasti klasės pvz PostgreSQL, MSSQL ir kitos - ir visose jose turės būti metodai get($table) ir getWhere($table, $where). Būtent su tokiais pavadinimais ir būtent su tokiais parametrais.

Svarbu, kad interfeisuose nėra minimos savybės - kalba eina TIK apie metodus, savybės interfeisuose negali būti aprašomos.

Turbūt vėlgi, kaip ir kiekvienoje pamokoje, jums kyla logiškas klausimas - o kam to reikia? Juk galima kurti klases ir apsiriboti vien tuo, ir viskas puikiai veiks. Taip, tas tiesa, interfeisai reikalingi labiau tada, kai reikia aprašyti klasių "planą", atsižvelgiant į tai, kad tos klasės gali būti kuriamos ne jūsų pačių, ir gali būti naudojamos ne jūsų pačių projekte.

Labai geras pavyzdys yra šiuolaikiniai PHP frameworkai. Jų kūrėjai dažnai apibrėžia interfeisus, kad kiti programuotojai būtent pagal tuos interfeisus galėtų kurti savo klases ir klasių paketus. Žvelgiant iš šio taško, interfeisai yra kaip laiškas-palikimas ateities kartoms, plius raštelis pačiam sau kad nepamirštum, su kokiais metodais kurti būsimas klases.

Abstrakčios klasės

Jeigu jau norime aprašyti, kaip atrodys klasės ateityje, yra ir ne toks griežtas metodas kaip interfeisai. Galima sukurti tėvinę abstrakčią klasę, kuri taip ir bus žymima - su žodžiu abstract. Beveik kaip interfeisuose - joje nebus jokių metodų realizacijos detalių, tik apibrėžimai ir parametrai. Ir vėliau ateityje klasės praplės šios tėvinės klasės funkcionalumą - šįkart jau su įprastu žodžiu extends (ne implements).

abstract class DB {
	public function get($table);
	public function getWhere($table, $where);
}

class MySQL extends DB {
	public function get($table) {
		// ... select * from $table
	}

	public function getWhere($table, $where) {
		// ... select * from $table $where
	}
}

$db = new MySQL(); // veiks tvarkingai
$db = new DB(); // išmes klaidą, nes abstrakčiai klasei negalima kurti objekto

Svarbus momentas, kaip matote pavyzdyje - abstrakčiai klasei negalima kurti objekto. Tik jos "dukterinėms" klasėms, kurios nėra abstrakčios.



(c) 2015-2018. Visais klausimais kreipkitės povilas@laraveldaily.com