Polimorfizm w PHP na cztery sposoby
- Szczegóły
- Kategoria: Class
- Opublikowano: czwartek, 01, luty 2018 10:38
- Super User
- Odsłony: 1171
Ucząc się na testy programowania oop w PHP natrafiłem na ciekawy temat jakim jest polimorfizm. Z racji tego, że mało było tematów na ten temat w języku Polskim postanowiłem troszkę ułatwić naukę przyszłym programistom szukającym jakiś materiałów na temat polimorfizmu i nawet podzielić go na kategorie. Nie spotkałem się z takim podziałem, więc mam nadzieję, że dobrze zrobiłem dzieląc go na cztery kategorie. Uważam takie stworzenie kategorii za łatwiej zrozumiałe i przejrzyste do dalszej nauki.
1. Polimorfizm Interfejsowy
2. Polimorfizm Abstrakcyjny
3. Polimorfizm Traits
4. Polimorfizm Dziedziczony
Jeżeli uważacie inaczej, dajcie znać, a wezmę wasze uwagi pod uwagę.
Pierwszym przedstawionym prze zemnie polimorfizmem w PHP, jest tradycyjny opierający się na interfejsie polimorfizm interfejsowy. Implementujemy interfejs z naszymi metodami do każdej klasy gdzie mają być wykorzystane. Dokładnie widać to na przykładzie poniżej.
Przykład 1 Polimorfizm Interfejsowy:
tytul; } public function setTytul($tytul){ $this->tytul = $tytul; } public function getAutor(){ return $this->autor; } public function setAutor($autor){ $this->autor = $autor; } } class Komiks implements Ksiegarnia{ public function getTytul(){ return $this->tytul; } public function setTytul($tytul){ $this->tytul = $tytul; } public function getAutor(){ return $this->autor; } public function setAutor($autor){ $this->autor = $autor; } $tytulBook = "Manager Wydobycia"; $cenaBook = "100 zł"; $autorBook = "Adam Berger"; ####### Book ######## $book1 = new Book(); $book1->setTytul($tytulBook); // Tytul echo $book1->getTytul()." "; $book1->setAutor($autorBook); // Autor echo $book1->getAutor()." "; $book1->setCena($cenaBook); // Cena echo $book1->getCena()." "; ####### Komiks ######## $tytulKomiks = "Komiks Manager Wydobycia"; $autorKomiks = "Adam Berger Komiks"; $cenaKomiks = "10 zł"; $komiks1 = new Komiks(); $komiks1->setTytul($tytulKomiks); // Tytul echo $komiks1->getTytul()." "; $komiks1->setAutor($autorKomiks); // Autor echo $komiks1->getAutor()." "; $komiks1->setCena($cenaKomiks); // Cena echo $komiks1->getCena()." "; ?>
Drugi przykład polimorfizmu przedstawia polimorfizm abstrakcyjny, dziedziczenie po klasie abstrakcyjnej i praktycznie niczym się nie różni od pierwszego przykładu z tym, że do klasy abstrakcyjnej możemy dodać jeszcze kolejne cechy potrzebne w dalszej pracy z programem. Możemy na przykład wykorzystać opisany polimorfizm klasy abstrakcyjnej w czwartym przykładzie, dodając go do klasy abstrakcyjnej.
Przykład 2 Polimorfizm Abstrakcyjny:
tytul; } public abstract function setAutor($autor); public function getAutor(){ return $this->autor; } public abstract function setCena($cena); public function getCena(){ return $this->cena; } } class Book extends Ksiegarnia{ public function setTytul($tytul){ $this->tytul = $tytul; } public function setAutor($autor){ $this->autor = $autor; } public function setCena($cena){ $this->cena = $cena; } } class Komiks extends Ksiegarnia{ public function setTytul($tytul){ $this->tytul = $tytul; } public function setAutor($autor){ $this->autor = $autor; } public function setCena($cena){ $this->cena = $cena; } } ####### Book ######## $tytulBook = "Book Manager Wydobycia"; $autorBook = "Adam Ber Book"; $cenaBook = "10 zł"; $book1 = new Book(); $book1->setTytul($tytulBook); // Tytul echo $book1->getTytul()." "; $book1->setAutor($autorBook); // Autor echo $book1->getAutor()." "; $book1->setCena($cenaBook); // Cena echo $book1->getCena()." "; ####### Komiks ######## $tytulKomiks = "Komiks Manager Wydobycia"; $autorKomiks = "Adam Ber Komiks"; $cenaKomiks = "5 zł"; $komiks1 = new Komiks(); $komiks1->setTytul($tytulKomiks); // Tytul echo $komiks1->getTytul()." "; $komiks1->setAutor($autorKomiks); // Autor echo $komiks1->getAutor()." "; $komiks1->setCena($cenaKomiks); // Cena echo $komiks1->getCena()." "; ?>
Kolejnym przykładem poliformizmu w PHP, jest przykład polegający na wykorzystaniu polimorfizm traits. Zauważmy , jak podczas tak wykonanemu programowi zmniejsza się ilość kodu potrzebnego do przedstawienie praktycznie tego samego co w poprzednim przykładzie.
Przykład 3 Polimorfizm Traits:
tytul; } public function setTytul($tytul){ $this->tytul = $tytul; } // Autor public function getAutor(){ return $this->autor; } public function setAutor($autor){ $this->autor = $autor; } // Kategoria public function getKategoria(){ return $this->kategoria; } public function setKategoria($kategoria){ $this->kategoria = $kategoria; } // Cena public function getCena(){ return $this->cena; } public function setCena($cena){ $this->cena = $cena; } // Gdzie znajduje się w Księgarni public function getPolka(){ return $this->polka; } public function setPolka($polka){ $this->polka = $polka; } } trait Ksiegarnia_nr_Isbn { public $isbn; public function getISBN(){ return $this->isbn; } public function setISBN($isbn){ $this->isbn = $isbn; } } trait Ksiegarnia_Wiek_Gracza{ public $wiekGraczy; public function getWiekGraczy(){ return $this->wiekGraczy; } public function setWiekGraczy($wiek){ $this->wiekGraczy = $wiek; } } class Book{ use Ksiegarnia, Ksiegarnia_nr_Isbn; } class Komiks{ use Ksiegarnia, Ksiegarnia_nr_Isbn; public $figurka; public function getKomiksZFigurka(){ return $this->figurka; } public function setKomiksZFigurka($figurka){ $this->figurka = $figurka; } } class GryPC{ use Ksiegarnia, Ksiegarnia_Wiek_Gracza; } class GryLinux{ use Ksiegarnia, Ksiegarnia_Wiek_Gracza; } ####### Book ######## $tytulBook = "Book Manager Wydobycia"; $autorBook = "Adam Ber Book"; $cenaBook = "10 zł"; $isbnBook = "ISBN: 34523211345546456456456"; $kategoriaBook = "Informatyka"; $polkaBook = "Półka nr 14 "; $book1 = new Book(); $book1->setTytul($tytulBook); // Tytul echo $book1->getTytul()." "; $book1->setAutor($autorBook); // Autor echo $book1->getAutor()." "; $book1->setCena($cenaBook); // Cena echo $book1->getCena()." "; $book1->setISBN($isbnBook); // nr ISBN echo $book1->getISBN()." "; $book1->setKategoria($kategoriaBook); // kategoria echo $book1->getKategoria()." "; $book1->setPolka($polkaBook); // która półka echo $book1->getPolka()." "; ####### Komiks ######## $tytulKomiks = "Komiks Manager Wydobycia"; $autorKomiks = "Adam Ber Komiks"; $cenaKomiks = "5 zł"; $isbnKomiks = "ISBN: 99995345546456456456"; $kategoriaKomiks = "Kajko i Ko"; $polkaKomiks = "Półka nr 15 "; $figurka = "Prezent do komiksu"; $komiks1 = new Komiks(); $komiks1->setTytul($tytulKomiks); // Tytul echo $komiks1->getTytul()." "; $komiks1->setAutor($autorKomiks); // Autor echo $komiks1->getAutor()." "; $komiks1->setCena($cenaKomiks); // Cena echo $komiks1->getCena()." "; $komiks1->setISBN($isbnKomiks); // nr ISBN echo $komiks1->getISBN()." "; $komiks1->setKategoria($kategoriaKomiks); // kategoria echo $komiks1->getKategoria()." "; $komiks1->setKomiksZFigurka($figurka); // Prezent do komiksu echo $komiks1->getKomiksZFigurka()." ";; $komiks1->setPolka($polkaKomiks); // która półka echo $komiks1->getPolka()." "; ##### Gry PC ######## $tytulPC = "Gra PC Manager Wydobycia"; $autorPC = "Adam Ber Gra PC"; $cenaPC = "1 zł"; $wiekGraczyPC = "Od 14 Lat"; $gryPc = new GryPC(); $gryPc->setTytul($tytulPC); // Tytul echo $gryPc->getTytul()." "; $gryPc->setAutor($autorPC); // Autor echo $gryPc->getAutor()." "; $gryPc->setCena($cenaPC); // Cena echo $gryPc->getCena()." "; $gryPc->setWiekGraczy($wiekGraczyPC); // Wiek Graczy echo $gryPc->getWiekGraczy()." "; ?>
Kolejny przykład czwarty z kolei polega na dziedziczeniu klasy i przesłanianie metody odziedziczonej. Jest to polimorfizm dziedziczony i przesłaniany w klasie docelowej. Także zmniejszamy tym samym ilość kodu potrzebnego do uruchomienia programu przedstawionym w pierwszym przykładzie. Część metod pozostaje w pierwszej klasie, które podczas użycia są przesłaniane danymi z klasy docelowej.
Przykład 4 Polimorfizm Dziedziczony:
tytul; } public function setTytul($tytul){ $this->tytul = $tytul; } // Autor public function getAutor(){ return $this->autor; } public function setAutor($autor){ $this->autor = $autor; } } class Book extends Ksiegarnia{ public function setTytul($tytul){ $this->tytul = $tytul; } public function setAutor($autor){ $this->autor = $autor; } } ####### Book ######## $tytulBook = "Book Manager Wydobycia"; $autorBook = "Adam Ber Book"; $book1 = new Book(); $book1->setTytul($tytulBook); // Tytul echo $book1->getTytul()." "; $book1->setAutor($autorBook); // Autor echo $book1->getAutor()." "; ?>
Oczywiście każda klasa powinna mieć swoje indywidualne cechy, tylko dla niej samej ponieważ inaczej nie było by sensu robić osobnych klas jak book, czy komiks. Można wtedy zrobić jedną klasę i dane tam zawarte zwracać dla book i komiks bez wykonywania osobnych klas. Dzieje się tak dla tego , że w klasie nic się nie zmienia oprócz samej nazwy klasy. Metody i zmienne pozostają takie same no chyba, że zależy nam na takich właśnie nazwach klas i ich wywoływania w takiej postaci.