• Početna
  • O nama
  • LimundoGrad
  • Limundo
  • Kupindo
  • Sigurnost
  • IT
  • Zabava i učenje
  • Plaćanje
  • API
LimundoGrad blog
  • Početna
  • O nama
  • LimundoGrad
  • Limundo
  • Kupindo
  • Sigurnost
  • IT
  • Zabava i učenje
  • Plaćanje
  • API
Home  /  IT  /  PHP preporuke petkom – Traits

PHP preporuke petkom – Traits

Autor:Miodrag Stefanović
14. јуна 2013. IT saveti 1 komentar

Traits su novina uvedena u PHP od verzije 5.4.0

Osnovna namena Trait-ova je da prevaziđu nedostatak višestrukog nasleđivanja u PHP-u, i da omogući bolji “code reuse” kroz horizontalno grupisanje i dodavanje funkcionalnosti. Trait je vrlo sličan standardnoj PHP klasi uz tu razliku što ga je nemoguće instancirati nezavisno već se jedino može dodeliti željenoj klasi putem use klauzule.

Good code
Preuzeto sa xkcd

U sledećem primeru ćemo definisati osnovnu klasu Osoba koja nosi zajedničku funkcionalnost definisanja JMBG.

//Zajednicka funkcionalnost za sve osobe
class Osoba {
    public $jmbg;
    public function GetJMBG() {
    echo $this->jmbg;
    }
}

i tri traita koji na logičan način grupišu osobine koje mogu da imaju različite osobe. Ove osobine se ne isključuju međusobno, već su grupisane radi centralizacije i višestrukog iskorišćenja programskog koda (reuse):

// Studenti imaju broj indeksa
trait Student {    
    public $brojIndexa;
    public function GetBrojIndexa() {
        echo $this->brojIndexa;
    }
}

//Zaposleni imaju godine staza i platu
trait Zaposleni {    
    public $godineStaza;
    public $plata;
    public function GetGodineStaza() {
        echo $this->godineStaza;
    }
    public function GetPlata() {
        echo $this->plata;
    }
}

//Stranci nemaju maticni broj, ali imaju broj pasosa
trait Stranac {    
    public $brojPasosa;
    public function GetBrojPasosa() {
        echo $this->brojPasosa;
    }
    public function GetJMBG() {
        echo “Stranci nemaju JMBG!”;
    }
}

Sada upotrebom odgovarajućih trait-ova možemo da gradimo razne tipove osoba na prost način i da dobijemo klase koje se lako održavaju i unapređuju.

Na primer definisaćemo klasu Radnik koja vertikalno nasleđuje klasu Osoba i dodeliti joj trait Zaposleni i time joj “horizontalno” dodeliti funkcionalnosti traita Zaposleni.

//Izvedena klasa nasledjuje Osoba klasu i dobija metode Zaposleni traita
class Radnik extends Osoba {
    use Zaposleni;
}

Klasa nasleđuje sve metode i property-je bazne klase i dodatno dobija metode i property-je upotrebljenog traita.

Objekat
$cRadnik=new Radnik();
će podržavati metode
$cRadnik->GetJMBG();
$cRadnik->GetGodineStaza();
$cRadnik->GetPlata();

Metode traita će overrideovati (premostiti) metode istog imena iz bazne klase, ali će metode u izvedenoj klasi overrideovati metode iz dodeljenih traitova, što dodatno omogućava razdvajanje i reuse programskog koda, uz čist i čitljiv kod.

Na primer sada možemo definisati klasu VanredniStudent kojoj ćemo dodeliti trait-ove Student i Zaposleni (jer vanredni student može istovremeno i da bude zaposlen) a u samoj klasi VanredniStudent ćemo dodati potpuno novu metodu GetSkolarina pošto vanredni student plaća i školarinu:

//Visestruko nasledjivanje traitova uz definisanje nove metode u izvedenoj klasi
class VanredniStudent extends Osoba {
    use Student,Zaposleni;
    public $skolarina;
    public function GetSkolarina() {
        echo $this->$skolarina;
    }
}

Kao primer overrideovanja metoda traita,  definisaćemo klasu Volonter za opisivanje zaposlenog lica koje ne prima platu i može da bude student:

//Volonter je zaposlen, ali ne prima platu, metoda GetPlata iz traita Zaposleni je  overrideovana da uvek ispise fiksnu poruku obavestenja
class Volonter extends Osoba {
    use Zaposleni,Student;
    public function GetPlata() {
        echo “Volontira”;
    }
}

I na kraju kao primer kada trait override-uje metode iz bazne klase definisaćemo klasu StraniStudent za opisivanje osobe koja je strani drzavljanin i studira:

//Metoda GetJMBG iz traita Stranac ce overrideovati istu metodu iz bazne klase i uvek ce ispisati ‘Stranci nemaju JMBG!’, ali ce zato trait Stranac dodati novu metodu GetPasos()
class StraniStudent extends Osoba {
    use Student,Stranac;
}

Svrha gornjih primera je da pokaže veliki potencijal traitova za kreiranje čistog i modularnog koda sa dobro enkapsuliranim funkcionalnostima.

Za korišćenje traitova je neophodan upgrade na PHP 5.4, ukoliko portujete postojeći kod sa ranijih verzija PHP-a obavezno istestirajte svoju aplikaciju pre puštanja u produkciju. PHP 5.4 je konačno ukinuo neke funkcionalnosti koje su već neko vreme zastarele (“deprecated”) kao što su na primer Safe mode, Magic quotes itd. Ukoliko ste se oslanjali na njih, može da se desi da se vaš kod na PHP 5.4 ponaša nepredvidljivo (mada je verovatnoća za to jako mala). Detaljni spisak ukinutih funkcionalnosti možete naći na http://www.php.net/manual/en/migration54.incompatible.php

Dalje istraživanje traitova možete nastaviti na
http://php.net/manual/en/language.oop5.traits.php

Očekujemo vaše primere i komentare, uvek smo dostupni i na @LimundoGradnja
Miodrag Stefanovic

Podeli tekst
Share on Facebook
Share on Twitter
Share on Whatsapp
 Prethodni post Da li ste spremni za plažu?
Sledeći post   [TOP 10] najpoželjnijih predmeta – osvojite jedan od njih

Povezani postovi

  • Dobro informisani = bolje zaštićeni! Kako do sigurne kupovine?

    15. марта 2024.
  • 5 predmeta koji će vam olakšati pripremanje trpeze

    6. јануара 2021.
  • Pomoć u odabiru prave knjige za poklon

    10. новембра 2020.

1 komentar

  1. Stevan
    20. новембра 2013. at 02:59

    Ovo je odlican post!

Advertisement

Popularno na Kupindu

U potrazi ste za udžbenicima za osnovnu ili srednju školu? Pogledajte na Kupindu:

➡️ Udžbenici za osnovnu školu
➡️ Udžbenici za srednju školu

Ovde ćete pronaći udžbenike za svaki razred i izdanja gotovo svih izdavača koje današnje škole traže. Uštedite na kupovini udžbenika.

  • Najpopularnije
  • Poslednji postovi
  • Za sledećih 15 Vladimir Nikolić 22. маја 2021. Limundo 607
  • Hoću da znam šta je neko kupio i prodao Vladan Jović 16. децембра 2013. LimundoGrad 355
  • Kako da ocenim prodavca (a da to bude ispravno)? Ana Mladenović 12. марта 2013. LimundoGrad 248
  • Veštačko nuđenje – istine i laži Vladan Jović 11. јуна 2013. Limundo 234
  • Cenovnik + opcije + brzina Aleksandra Vuković 15. марта 2012. Blog 211
  • Dani ploča na Kupindu: Vinil ne izlazi iz mode! Dunja Stojković 13. марта 2025. Kupindo
  • Top 10 predmeta sa Limunda i Kupinda u 2024. godini! Dunja Stojković 31. децембра 2024. LimundoGrad
  • Digital Awards 2024: Limundo osvojio nagradu za najbolju radijsku kampanju! Dunja Stojković 30. септембра 2024. LimundoGrad
  • Polovna odeća kao znak stila: 10 vrhunskih modnih brendova koje nećete naći u tržnom centru Ivana Lučić 26. августа 2024. LimundoGrad
  • Uživanje u letnjem danu – detalji koji čine baštu posebnom Dunja Stojković 1. августа 2024. Zabava i učenje

Skorašnji komentari

  • Jovana Milenković Arizanović на Tri najjeftinija načina za slanje paketa u LimundoGradu
  • Marija Protic на Tri najjeftinija načina za slanje paketa u LimundoGradu
  • Jovana Milenković Arizanović на Tri najjeftinija načina za slanje paketa u LimundoGradu
  • janoš на Tri najjeftinija načina za slanje paketa u LimundoGradu
  • janoš на Tri najjeftinija načina za slanje paketa u LimundoGradu

Vremeplov

© 2008. LimundoGrad d.o.o. Creative Commons License Ovo delo je licencirano pod uslovima licence Creative Commons Autorstvo-Nekomercijalno-Bez prerada 4.0 Međunarodna licenca
LimundoGrad koristi kolačiće u statističke i marketinške svrhe. Nastavkom korišćenja sajta smatramo da ste pristali na upotrebu kolačića.OKViše informacija