Object Oriented PHP

OOP është dizenjimii i softwareve ku implementimi i të dhënave abstrakte është i strukturuar.

Shumë programues pasi janë mësuar me mënyrën proçeduriale të të programuarit kane veshtiresi kur përballen me OOP dhe kjo sepse OOP kërkon një mënyrë ndryshe të të parit të gjërave. Por çfarë është OOP? Është një stil programimi që e bazon të menduarit në objektet e botës reale. Zakonisht kur mendojmë për programe, mendojmë në funksionalitetin e tyre për shembull themi nëse një program llogarit sipërfaqen e një rrethi, llogarit shumën e numrave nga 1-n etj. Këto programe bëhen funksionale duke përdorur funksione të cilat veprojnë mbi variablat dhe në fund na sjellin një rezultat. Ndërkohë që në OOP është mirë të mendojmë fillimisht për qëllimin e programit tonë(pa e ngatërruar me funksionalitetin) dhe më pas mund të fillojmë ta ndajmë programin duke i menduar pjesët e programit si objekte, dhe duke analizuar çfarë karakteristikash kanë këto objekte, a kanë ngjashmëri dhe a mund të krijojnë një lidhje me njëra tjetrën. Ka ardhur koha që jo vetëm të prezantohemi me OO por edhe ta zotrojmë atë duke qënë se thuajse të gjitha gjuhët moderne të programimit janë ose janë kthyer ne OO, për shembull PHP ka qenë fillimisht një gjuhë proçeduriale, por tashmë është zgjeruar duke përdorur tipare të OOP që prej PHP4 dhe u avancua me tej në versionin e PHP5, i cili është i dizenjuar për OOP. Megjithë atë edhe në këtë version mund të programohet “si zakonisht”. Për të patur një pamje më të qartë të programimit në OO duhet të njihemi fillimisht me disa koncepte kryesore ku ky lloj programimi mbështetet. Disa prej koncepteve janë mjaft të ngjashme me njëra-tjetrën dhe është e rëndësishme të njohim dallimet ndërmjet tyre për ti përdorur ato në mënyrën dhe vendin e duhur.

• Konceptet fondamentale

1. Objekt vs Klasë– Klasa është prezantimi i një tip objekti. Ose thënë ndryshe një plan që përshkruan detajet, formën dhe mënyrën se si funksionon një objekt. Një analogji e mirë për të kuptuar ndryshimin ndërmjet një klase dhe një objekti është të krahasosh planin në letër të një shtëpie dhe vete shtëpinë e prezantuar në planë. Klasa është plani i shtëpisë me të gjitha detajet e saj(formën, hapsirën etj) ndërsa objekti është vetë shtëpia(objekti konkret) e cila është e ndërtuar sipas planit fillestar. Një klasë përbëhet nga tre komponent kryesor: emri,atributet dhe metodat.

Në ‘përcaktimin e klasës’ bëjnë pjesë të ashtëquajturat ‘veçori të klasës’ që nuk janë gjë tjetër veç se variabla që shprehin atribute të klasës për shembull për një student të dhëna të nevojshme do të ishin emri, mbiemri,vendlindja,etj..dhe kjo do të shprehej kështu:

class student {
private $emri;
private $mbiemri;
private $vendlindja;
}

Një objekt mund të krijohet duke përdorur fjalën kyçe “new” për shembull:

$obj = new student;

Dhe për të liruar memorjen e perdorur nga një objekt përdoret: unset($obj);

2. __construct(),__destruct() Të gjithë objektet kanë një metodë të quajtur ‘konstruktorë’. Konstruktorët lejojnë inicializimin e veçorive të objektit kur ky i fundit krijohet. Edhe në qoftë se ju nuk e krijoni konstruktorin PHP do të thërrasë konstruktorin automatikisht me krijimin e objektit. Konstruktorët e klasës bazë nuk thërriten në mënyrë implicite në qoftë se klasa e derivuar ka një konstruktorë. Për të përdorur konstruktorin e klasës bazë sintaksa është parent::__construct(). Metoda destructor thërritet kur nuk ka më referenca për një objekt të caktuar automatikisht nga sistemi por destructor-i mund te therritet edhe duke perdorur:

unset($objRef);

Njësoj si me konstruktorin edhe destruktori i klasës bazë nuk thërritet në mënyrë implicite nga klasa e derivuar. Sintaksa për destruktorin është parent::__destruct(). Destruktori thërritet edhe kur ekzekutimi i skriptit ndalohet nga funksioni exit(). Kur exit() thërritet ne trupin e destruktorit ndalohet ekzekutimi i rutinës së mbetur për mbylljen.

class klasaBaze
{

function __construct()
{
print "Konstruktori i klases baze!";
}

function __destruct()
{
print "Destruktori i klases baze!";
}

}

class klasaDerivuar extends klasaBaze
{

function __construct()
{
parent::__construct(); // Do te shfaq perseri msg: "Konstruktori i klases baze!"
print "Konstruktori i klases se derivuar!";
}

function __destruct()
{
print "Destruktori i klases se derivuar!";
}

}

$obj1=new klasaBaze();
$obj2=new klasaDerivuar();
?>

Siç mund të shikohet edhe në shembullin e mësipërm fillimisht thërritet konstruktori i klasës bazë pastaj ai i klasës së derivuar, me qënë se në këtë të fundit thërritet edhe konstruktori i klasës bazë në ekran do të shfaqet përsëri mesazhi i përcaktuar në këtë konstruktor. Diçka për tu vën re është edhe rendi i thërritjes së destruktorëve. Fillimisht bëhet mbyllja e klasës së derivuar dhe më pas thërritet destruktori i klasës bazë. Outputi i këtij kodi do të ishte si mëposhtë:

Konstruktori i klases baze!
Konstruktori i klases baze!
Konstruktori i klases se derivuar!
Destruktori i klases se derivuar!
Destruktori i klases baze!

3. Enkapsulimi – Është grupimi i ‘public methods’ dhe i variablave së bashku në një struktur koherente të dhënash(klasë), të cilat më pas do të perdoren nga objekti në menyrë që të funksionojë. Klasa është si një kapsulë që fsheh brendësin e metodës, atributet dhe veçoritë me anë të të cilave kryen funksionalitetin e saj mbi klasat e tjera. Ideja e enkapsulimit është që të fsheh se si një klas punon por njëkohësisht të lejoj marrjen e kërkesave për atë që duhet të bëjë.

4. Inheritance – lejon një klasë të specifikojë/zgjeronë (extend) një tjetër klasë dhe të trashëgojë të gjithë metodat, veçoritë dhe sjelljet e klasës bazë. Kjo ndihmon shumë në implementimin e funksioneve të njëjta në objekte të ngjashëm duke reduktuar kështu rishkrimin e të njëjtave rrjeshta programi. Koncepti i të kaluarit nga e përgjithshmja në specifiken ështe mjaft i rëndësishëm në OOP dhe kjo arrihet duke përdorur inheritance.

class person
{
public $emri ="Une";
public function metoda()
{
return $this->emri;
}
}

class student extends person
{
public $dega="Informatike";
public function metodaTjeter()
{
return $this->dega;
}
}
$obj = new person;
echo $obj->metoda();
echo " dua te aplikoje ne degen ";
echo $obj->metodaTjeter();
?>

 5. Metodat janë esencialisht funksionet e një klase, ato përmbajnë të dhëna dhe veprime logjike.

a) “Method Overriding” – ndodh kur kemi implementimin e të njëjtës metodë në klasën e derivuar. Këto dy metoda kanë të njëjtat parametra por implementime të ndryshme. Njëra prej këtyre metodava eksizston në klasën bazë dhe tjetra në klasën e derivuar. Por ato nuk mund të ekzistojnë kurrsesi në të njëjtën klasë. Arsyeja pse përdoret “Method Overriding” është që klasa e derivuar të modifikojë funksionalitetet e klasës bazë. Për të përdorur edhe metodat e specifikuara në klasën bazë përdoret ‘invokimi’ i metodës bazë, për të cilën sintaksa është si më poshte parent::function_name();

class dega
{
public $dega1 ="Informatik ekonomike";
public function metoda()
{
echo "StudentiX do te aplikoje ne degen";
return $this->dega1;
}
}
class fakulteti extends dega
{
public $fakulteti1 ="Ekonomik";

public function metoda()
{
parent::metoda();
echo " ne fakultetin ";
return $this->fakulteti1;
}
}
$obj = new fakulteti;
echo $obj->metoda();
?>

b) “Method Overloading” – nododh kur kemi dy ose më shumë metoda me të njëjtin emër por me parametra të ndryshëm për të kryer njëjtin qëllim. Këto dy metoda mund të ekzistojnë në të njëjtën klasë ose njëra në klasën bazë dhe tjetra në klasën e derivuar. Method overloading përdoret kur ju kërkoni që të bëni dy gjëra konceptualisht të njëjta por me parametra të ndryshëm. Kjo mënyrë nuk mund të aplikohet në PHP por ekzistojnë disa funksione që numërojnë parametrat si për shembull: func_num_args, të cilat bëjnë të mundur që të kryhet i njëjti funksionalitet siç do të bëhej me ‘Method Overloading’

class mbledhje
{
public $var1,$var2,$var3,$var4;

public function sigma()
{
$arg = func_get_args();
switch(func_num_args())
{
default:
case 2:
self::sigma2( $arg[0], $arg[1]);
break;
case 4:
self::sigma1($arg[0], $arg[1], $arg[2], $arg[3]);
break;
}
}

public function sigma1($var1, $var2, $var3, $var4)
{
$this->var1=$var1;
$this->var2=$var2;
$this->var3=$var3;
$this->var4=$var4;
return $var1+$var2+$var3+$var4;
}

public function sigma2($var1, $var2)
{
$this->var1=$var1;
$this->var2=$var2;
return $var1+$var2;
}

$obj = new mbledhje;

echo "Shuma e kater argumenteve eshte: ";
echo $obj->sigma1('1', '2', '3', '4');
echo"\r\n";
echo "Shuma e dy argumenteve eshte: ";
echo $obj->sigma2('1', '2');
?>

Rregulli I Faustit: Një metod nuk duhet të jetë më e gjatë se madhësia e ekranit. Në qoftë se ajo është më e gjatë atëherë duhet të ndahet në nën-metoda!

6. Polymorphism – Fjala polymorphism vjen nga greqishtja ku poly do të thotë shumë dhe morph do të thotë formë. Përshkruan nje model në OOP në të cilin klasat kanë funksionalitete të ndryshme por të njëjtin interface. Analogjia më e mirë për polimorfizmin është me klikimin e një butoni. Se çfarë mund të sjell klikimi i një butoni kjo varet se me çfarë është lidhur ky buton dhe konteksti ku përdoret, por rezultati nuk ndryshon mënyrën e përdorimt, pavarësisht butonit që ai të sjell një rezultat duhet klikuar. Zakonisht përdoren dy mënyra për polimorfizmin: në compile time(ku kemi methods dhe operators overloading) ose në run time(nëpërmjet inheritance dhe method overriding). Në php për polimorfizmin është e mundur vetëm mënyra e dytë me run time.

7. Interface – Një interface është i ngjashëm me një klasë përveç faktit që nuk mund të përmbaj kode. Ai mund të përcaktoj emrat e metodave dhe argumenteve por jo përmbajtjen e tyre. Çdo klasë që implementon një interface duhet të implementoj të gjitha metodat e përcaktuara nga interface-i. Një klasë mund të implementoj disa interface-e.

interface myInterface
{
public function metoda();
public function metodaTjeter($dega);
}

class student implements myInterface
{
public $emri ="Une";
public $dega="Informatike";
public function metoda()
{
return $this->emri;
}
public function metodaTjeter($dega)
{
return $this->dega;
}
}
$obj = new student;
echo $obj->metoda();
echo " do te aplikoje ne degen ";
echo $obj->metodaTjeter($dega);
?>

8. Abstract class – është një “përzierje” e një klase dhe një interface-i. Këto klasa mund të përcaktojnë metoda njësoj si në një interface(në formën e abstract method), ato nuk mund të inicializohen po vetëm të derivohen. Klasat që specifikohen nga abstract classes duhet të implementojnë të gjita abstract methods të përcaktuara në abstract class.

abstract class AbsClass
{
//duhet specifikuar ne klasen e derivuar
abstract public function metoda();

//funksion normal
public function metodaTjeter($dega)
{
return $dega;
}
}

class student extends AbsClass
{
public function metoda()
{
return "Une do te aplikoj ne degen ";
}
}

$obj = new student;
echo $obj->metoda();
echo $obj->metodaTjeter('Informatike');
?>

9. Abstract class vs Interface

Abstract Class

a) Një abstract class ka disa funksionalitete dhe pjesa tjetër përcaktohet nga klasa e derivuar.
b) Klasa e derivuar mund të ‘override’ funksionet e përcaktuara në klasën bazë ose jo.
c) Një klasë bazë e derivuar nga një abstract class duhet të lidhet logjikisht me të.

Interface

a) Interface nuk mund të përmbajë funksionalitete. Ai përmban vetëm emrat dhe tipet e metodave.
b) Klasa e derivuar nga një interface duhet të caktojë funksionalitetin e çdo metode të permendur në interface.
c) Klasa shumë të ndryshme dhe pa asnjë lidhje ndërmjet tyre mund të bashkohen duke përdorur një interface.

10. Data Hiding – “shikueshmëria”/aksesi i variablave ose metodave mund të përcaktohet duke vendosur gjatë deklarimit fjalët kyçe: public,protected ose private.

• Public- çdokush ka akses.
• Protected- ka akses vetëm brenda klasës dhe nga klasat pasardhëse ose prind.
• Private- mund të aksesohet vetëm nga klasa ku është krijuar variabla ose metoda.

Në qoftë se variablat ose metodat nuk janë përcaktuar, atëherë ato bëhen automatikisht public. Objektet e të njëjtit tip kanë akses për variablat apo metodat private ose protected edhe në qoftë se nuk i përkasin të njëjtës instance, kjo sepse detaje specifike të implementimit janë të njohura brenda objekteve.

11. Serializimi i Objekteve – Kur një objekt dërgohet në network ose kur ai duhet te ruhet për tu përdorur më vonë, është e nevojshme që të bëhet serializimi i objektit. Serializimi i një objekti është proçesi i shkrimit te gjëndjes së tij në sekuenca të dhënash për cdo element të objektit. Në qoftë se serializimi nuk bëhet gjëndja e objektit do të jetë e panjohur kur të dergohet dhe dërgimi nuk do të kryhet. Pasi një objekt është serializuar ai mund të dërgohet në network, të shkruhet në database, file etj.. Dhe më vone mund të deserializohet duke e përftuar me të njëjtën gjëndje. Serializimi bëhet me funksionin serialize() dhe deserializimi me funksionin unserialize()

class student
{
private $idStudent;
private $emer;

public function __construct($idStudent,$emer)
{
$this->idStud = $idStudent;
$this->emer = $emer;
}

public function setID($idStudent)
{
$this->idStud = $idStudent;
}

public function setEmer($emer)
{
$this->emer = $emer;
}

public function getID()
{
return $this->idStud;
}

public function getEmer()
{
return $this->emer;
}
}

$obj = new student('12345','Emer Mbiemr');
$ser = serialize($obj);
echo "Objekti i serializuar:";
echo $ser;
$newObj = unserialize ($ser);
echo "Objekti i deserializuar:";
print_r ($newObj);
?>

12. “Metodat Magjike” – Metodat janë funksione, metodat magjike janë funksione speciale të rezervuara në PHP. Ato duhet të fillojnë me dy viza: __. Disa prej tyre janë __construct(), __call(), __get(), __set() __sleep(), __wakeup() etj.. Kur thërritet funksioni serialize() ai shikon në qoftë se në objektin me të cilin po punon ka funksion __sleep(). Në qoftë se po ky funksion ekzekutohet para serializimit. E njëjta gjë vlen edhe për __userialize(), fillimisht shikon në qoftë se ka funksion __wakeup(), i cili mund të rikonstruktoj të gjitha resorset që një objekt mund të ketë. Funksionet sleep() dhe wakeup() bëjnë të mundur funksionimin korrekt gjatë periudhës hibernate. Për shembull kurr thërritet __sleep() objekti që transportohet duhet të ruhet dhe të mbyllet file-i ku po shkruhej, gjithashtu kur ka objekte që nuk duhet të ruhen komplet vjen në ndihmë ky funksion. Kur __wakeup() thërritet duhet të rihapet file-i dhe të vazhdohet të shkruhet. __wakeup përdoret edhe për të rivendosur çdo lidhje me databazën që mund të jetë ndërprerë gjatë proçesit të serializimit. __wakeup() nuk duhet të kthejë vlera por __sleep() duhet të kthejë një array të vlerave që ju doni të ruani.

class student
{
public $emer;
public $nota;
public $id;

public function __construct()
{
$this->emer=$emer;
$this->nota=$nota;
$this->id=$id;
}

public function __sleep()
{
return array ('emer','nota','id');
}

public function __wakeup()
{
$this->show();
}

public function show()
{
echo "\n".$this->emer.' '.$this->nota.' '.$this->id."\n";
}
}

$obj = new student();
$objSer = serialize ($obj);
echo "\n Te dhenat e serializuara ".$objSer."\n";
$objUnser = unserialize($objSer);
echo "Te dhenat e deserializuara";
print_r ($objUnser);
?>

Të programosh do të thotë të kalosh nga një gjëndje e qëndrueshm në një tjetër gjëndje të qëndrueshme, të një niveli më të lart.

to the next time!

Leave a Reply

Your email address will not be published. Required fields are marked *