Menu

Mostenire, Abstract si Interface

1. Mostenire

In OOP o clasa poate mostenii metodele si proprietatile altei clase. O clasa poate mostenii o singura alta clasa, una din clase este cea parinte iar alta este cea copil(cea care mosteneste proprietatile si metodele clasei parinte). Nu uitati ca este extra recomandat sa folositi o structura a claselor bazata pe fisiere, noi vom folosii un singur fisier pentru a nu complica exemplul.
Pentru a seta unei clase sa mosteneasca proprietatile si metodele altei clase folosim dupa numele clasei(cand o declaram) instructiunea extends urmata de numele clasei parinte. Mai jos vei vedea un exemplu.

Cod test.php:
<?php 
# fisier: /test.php

class Parinte{
	public $variabila_din_parinte = 'PHP';

	public function functie(){
		echo 'Functia din parinte a fost apelata<br/>';
	}
}

# Observati folosirea extends-ului
class Copil extends Parinte{
	function __construct(){
		echo 'Variabla din parinte contine: <b>'.$this->variabila_din_parinte.'</b><br/><br/>';
	}
}

$copil = new Copil;

# Observati ca apelam functia functie declarata intitial in Parinte cu obiectul copilului
$copil->functie();
?>
Output:


Un exemplul practic de folosire a mostenirii este o clasa CORE in care sunt functii pentru lucrul cu MySQL si o clasa Useri care are nevoie de functiile pentru lucrul cu MySQL.

2. Clase abstracte

Clasele abastracte sunt un fel de parinti mai severi, clasele abstracte seamana cu clasele simple doar ca-i mai impun copilului si sa detina niste functii. Clasa copil care mosteneste o clasa abastracta trebuie sa detina toate metodele abastracte declarate in clasa abstracta parinte.
Clasele abstracte pot contine si metode normale. De mentionat ca clasele abastracte nu pot avea instante si nici metode statice abstracte. Proprietatile nu pot fi abstracte.
In DEX abstract are urmatoarea definitie:
ABSTRÁCT, -Ă, abstracți, -te, adj., s. n. 1. Adj. Care este gândit în mod separat de înfățișarea materială, de exemplele particulare, de ansamblul concret (senzorial) din care face parte; care este detașat de obiecte, de fenomene sau de relațiile în care există în realitate. ◊ Loc. adv. În abstract = pe bază de deducții logice, teoretice, fără legătură cu datele sau cu faptele concrete. 2. S. n. Moment al procesului cunoașterii care constă în desprinderea mintală a determinărilor fundamentale, generale ale obiectului studiat. ◊ Artă abstractă = arta care nu caută să reprezinte elementele realității obiective; artă nonfigurativă, abstracționism. 3. Adj. Conceput în mod prea general, prea teoretic; p. ext. greu de înțeles din cauza lipsei de ilustrări concrete. 4. S. n., adj. (Cuvânt) care are sens abstract (1). ◊ Abstract verbal = substantiv care provine dintr-un verb și exprimă acțiunea verbului respectiv. – Din lat. abstractus, germ. abstrakt, fr. abstrait.

Un exemplu vei vedea mai jos.
<?php 
# fisier: /test.php

abstract class Parinte{
	# Metodele abstracte au abstract in fata
	abstract public function citeste($argument);

	# O clasa abstracta poate contine si metode simple
	public function functie(){
		echo 'A fost apelata functia <b>functie</b> din clasa abstracta <b>Parinte</b><br/><br/>';
	}
}

# O clasa copil mosteneste o clasa abstracta la fel ca una normala
class Copil extends Parinte{

	# Este obligatoriu ca clasa copil sa detina metodele abstracte
	# Functia trebuie sa contina tot atatea argumente cat cea abastracta
	# Numele argumentelor nu conteaza
	public function citeste($arg1){
		echo 'A fost apelata functia <b>citeste</b> cu argumentul <b>'.$arg1.'</b>';
	}
}

$copil = new Copil;

# Observati ca apelam functie declarata intitial in Parinte cu obiectul copilului
$copil->functie();

$copil->citeste('PHP');
?>
Output:


Daca o metoda abstracta din clasa parinte nu este declarata si in clasa copil se genereaza o eroare asemanatoare cu:
Fatal error: Class Copil contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Parinte::citeste)
Daca o metoda abstracta din clasa parinte nu are tot atati parametrii cat cea declarata in clasa copil se genereaza o eroare asemanatoare cu:
Fatal error: Declaration of Copil::citeste() must be compatible with that of Parinte::citeste()
Insa metodele care sunt abastracte in clasa parinte pot contine in clasa copil si argumente in plus optionale.

3. Interface

Daca ai invatat in capitolul 2 despre clase abstracte acum este timpul sa inveti despre interfete. Interfetele nu sunt clase, sunt doar interfete, nu pot contine alt cod decat metode „abstracte”. Avantajul interfetelor este ca pot fi folosite mai multe la o singura clasa pe cand la mostenire o clasa nu poate mostenii mai mult de o clasa. Interfetele se declara ca clasele decat ca in locul class se foloseste interface. O interfata se adauga intr-o clasa folosind implements dupa nume urmat de numele interfetei, in caz ca sunt mai multe interfete ele sunt separate prin vilgura. Mai jos vei vedea un exemplu.

Cod test.php:
<?php 
# fisier: /test.php

interface Template{
	public function a();
}
interface Template2{
	public function b();
}

class Exemplu implements Template, Template2{
	public function a(){
		echo 'Functia '.__FUNCTION__.' a fost apelata.<br/><br/>';
	}
	public function b(){
		echo 'Functia '.__FUNCTION__.' a fost apelata.';
	}
}

$obiect = new Exemplu;

$obiect->a();

$obiect->b();
?>
Output:


La fel ca la clase abstracte, daca o functie declarata in interfata nu exista in clasa se genereaza o eroare asemanatoare cu:
Fatal error: Class Exemplu contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Template::a)
Iar daca nu contine acelasi numar de parametrii:
Fatal error: Declaration of Exemplu::a() must be compatible with that of Template::a()
Insa metodele din interfata pot contine in clasa copil si argumente in plus optionale.
vv

Ti-a placut articolul? Asigura-te ca-ti dam de veste cand publicam altele noi.


Tags: Tutoriale, Programare Web, Php, Curs Php

Comments Nota 0 din 0