Sąsajos OOP PHP
Kaip jau žinote, abstrakčios klasės yra savo palikuonių metodų rinkinys. Dalį šių metodų galima įgyvendinti pačioje klasėje, o dalis metodų gali būti paskelbti abstrakčiais ir reikalauti įgyvendinimo vaikų klasėse.
Įsivaizduokime situaciją, kai jūsų abstrakti klasė yra tik abstrakčių viešųjų metodų rinkinys, nepridedant metodų su įgyvendinimu.
Faktiškai jūsų pagrindinė klasė apibūdina sąsają palikuonių, tai yra rinkinį jų viešųjų metodų, privalomų įgyvendinti.
Kam mums to reikia: kad programuodami darytume mažiau klaidų - aprašę visus reikalingus metodus pagrindinėje klasėje, galime būti tikri, kad visi palikuoniai juos tikrai įgyvendins.
Kai tai padės: tarkime, sukursime savo pagrindinę klasę ir kelis jos palikuonis. Jei po kiek laiko, pavyzdžiui, po mėnesio, nuspręsime sukurti dar vieną palikuonį, tikriausiai jau pamiršime savo kodo detales ir galime pamiršti parašyti kokio nors metodo įgyvendinimą naujajame palikuonyje. Tačiau pats PHP neleis prarasti metodo - ir tiesiog išduos klaidą.
Tai pats tas pats ir kitam programuotojui, dirbančiam su jūsų projektu. Tarkime, pagrindinės klasės kodą rašėte jūs, o tada jūsų kolega nusprendė sukurti dar vieną palikuonį. Jūsų kolega taip pat negalės prarasti poros metodų.
Tačiau yra problema: faktiškai mes padarėme savo pagrindinę klasę tam, kad rašytume joje abstrakčius viešuosius metodus, bet mes patys ar mūsų kolega turime galimybę netyčia pridėti į šią klasę ne viešą metodą ar ne abstraktų.
Tarkime, norime fiziškai uždrausti daryti pagrindinėje klasėje kitus metodus, išskyrus abstrakčius viešuosius. PHP tam vietoj abstrakčių klasių galima naudoti sąsajas.
Sąsajos yra klasės, kurių visi metodai yra vieši ir neturi įgyvendinimo. Metodų kodą turi įgyvendinti sąsajų palikuonių klasės.
Sąsajos deklaruojamos taip pat, kaip ir įprastos
klasės, bet naudojant raktinį žodį interface
vietoj žodžio class.
Paveldėjimui iš sąsajų naudojama
šiek tiek kitokia terminologija: sakoma, kad
klasės nepaveldi iš sąsajų, o įgyvendina
jas. Atitinkamai vietoj žodžio extends
reikia naudoti raktinį žodį
implements.
Negalima sukurti sąsajos objekto. Visi sąsajos
metodai turi būti paskelbti kaip public
ir neturi turėti įgyvendinimo. Sąsaja
gali turėti tik metodus, ne savybes.
Taip pat negalima padaryti sąsajos ir klasės su
tuoj pačiu pavadinimu.