PHP folosind OOP - Encapsulation pe intelesul tuturor.

Post Title

Salut tuturor! Astazi vom invata despre unul din conceptele de baza ale stilului de programare orientat pe obiecte folosind ca limbaj de referinta, limbajul PHP.Mai precis vom discuta despre incapsulare ( encapsulation ).Eu am mai atins acest concept in unul din tutorialele prezentate.

Presupun ca cei ce citesc aceste randuri stiu ce este o clasa, ce este un obiect, elementele fundamentale ale unei clase si de asemenea, cum sa interactioneaze cu un obiect creat.

Trecem la subiect! Ce presupune acest concept? Ei bine, acest concept presupune protejarea proprietatilor unui obiect astfel incat accesare si modificarea lor sa se faca doar prin intermediul metodelor ( functiilor ).

Probabil ( mai mult ca sigur ) ati intalnit cuvinte precum public, private si protected, si de asemenea, va intrebati care este scopul lor, la ce ajuta? Ei bine, aceste cuvinte reprezinta modul in care o proprietate/metoda se poate accesa.Probabil stiati si acest lucru, dar totusi la ce ajuta? Ei bine, asta vom intelege pe baza urmatorului exemplu.

Sa presupunem ca avem clasa Money, aceasta clasa are proprietatea $amount avand vizibilitatea setata ca public si o valoare implicita, 0.

<?php

class Money
{
    public $amount = 0;
}

De asemenea, aceasta clasa are doua metode avand vizibilitatea setata ca public, care ne ajuta sa interactionam cu proprietatea $amount.Prima metoda se numeste getAmount(), scopul ei fiind sa returneze valorea proprietatii $amount.Ultima metoda se numeste setAmount(), scopul ei fiind sa atribuie o valoare pentru proprietatea $amount, insa aceasta metoda mai face ceva.Logica acestei metode presupune verificarea tipului de date al valorii introduse pentru parametrul $amount ( putem folosi si type hinting, dar alta data ), cu alte cuvinte, daca este integer ( daca este numar ) si de asemenea, mai presupune asigurarea faptului ca aceasta valorea nu este mai mica decat 0, nu este negativa.Daca una din aceste conditii nu este indeplinita, o exceptie este emisa.

<?php

class Money
{
    public $amount = 0;

    public function getAmount()
    {
        return $this->amount;
    }

    public function setAmount($amount = 0)
    {
        if (!is_integer($amount) || $amount < 0) {
            throw new Exception("The value passed has to be number, even or greater than 0");
        }

       $this->amount = $amount;
    }
}

Toate bune si frumoase, haide sa cream un obiect pentru aceasta clasa si sa vedem pe mai departe ce se intampla.

<?php

// cream un obiect pentru clasa Money
$money = new Money;

// setam valoarea 10 pentru proprietatea $amount folosindu-ne de metoda setAmount()
$money->setAmount(10);

// setam un rand nou
echo "<br>";

// preluam valoarea proprietatii $amount folosindu-ne de metoda getAmount() si o afisam
// se afiseaza 10, cele doua conditii au fost indeplinite.
echo $money->getAmount();

// insa, dat fiind faptul ca proprietatea $amount are vizibilitatea public, o putem accesa din exterior
// am setat pentru aceasta proprietatea, valoarea "Ce chestie..", ce este un string.
$money->amount = "Ce chestie..";

// preluam si afisam din nou valoarea proprietatii amount
// se afiseaza "Ce chestie.."
echo $money->getAmount();

Dupa cum puteti observa, acest lucru creaza o problema mare.Cele doua conditii din metoda setAmount() nu mai sunt puse in aplicare deoarece noi nu mai apelam aceasta metoda, cu alte cuvinte, prin accesarea si modificarea directa a proprietatii $amount am stricat totul.

Cum putem remedia aceasta "bresa",? Ei bine, setand o vizibilitate diferita de public pentru proprietatea noastra, de exemplu, protected.Astfel, accesarea acestei proprietati nu se mai poate face din "exterior", cu alte cuvinte, protejam modul de functionare al obiectelor create.

<?php

class Money
{
    protected $amount = 0;

    public function getAmount()
    {
        return $this->amount;
    }

    public function setAmount($amount = 0)
    {
        if (!is_integer($amount) || $amount < 0) {
            throw new Exception("The value passed has to be number, even or greater than 0");
        }

       $this->amount = $amount;
    }
}

Asta presupune incapsularea, protejarea proprietatilor unui obiect, setand o vizibilitate diferita de public, astfel incat accesarea si modificarea lor sa se faca prin intermediul metodelor, protejand si buna functionare a obiectelor create.

Acum, un sfat, atunci cand preluati sau modificati valoarea unei proprietati, este recomandat ca numele metodelor sa fie de forma, setProprietate() si getProprietate(), intelegeti?

Sper ca va ajuta!

Autor articol
David: Why do you want to leave me? Why? I'm sorry I'm not real! If you let me, I'll be so real for you!

Comentarii

Comentariu adaugat de marian
Bravo Catalin pentru noul tau articol!
go to page top marian | 2016-10-19

  • 1
Trebuie sa fii logat sa poti lasa un comentariu Autentificare Inregistrare Logare cu Facebook
top