Polimorfizm w PHP na cztery sposoby

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.

Polimorfizm w PHP na cztery sposoby-GITHUB

Class PHP CompareFile

Chciałem wam zaprezentować nową klasę, którą stworzyłem do porównywania plików z danego folderu z plikiem tekstowym, w którym podajemy pliki do usunięcia lub do pozostawienia. __construct( $file1, $file2, $numeric ); Wszystko do ustawienia w parametrze wejściowym do klasy. Klasa bardzo prosta a jak nie kiedy potrzebna może wam się przyda na coś

Link do download na github Github class php CompareFile

Plik CompareFile.php



 * Porównuje pliki z wybranego folderu z plikiem tekstowym, zawierającym podaną ścieżkę do pliku.
 * Pliki nie znajdujące się na liście usuwa z podanego folderu. 
 *  0 usuń pliki wskazane w pliku tekstowym
 *  1 zachowaj pliki wskazane w pliku tekstowym
 *******************************************************************************************
 * Compares files from the selected folder with a text file containing the specified path to the file.
 * Files that are not in the list are removed from the specified folder.
 * 0 delete the files indicated in the text file
 * 1 keep the files indicated in the text file
 */
   public $file1;
   public $file2;
   private $numeric;
   public $error = array();
   private $Tab  = array();
   private $Tab1 = array();
     /**
      *  _construct( $file1, $file2, $numeric )
      *  string $file1 lokalizacja pliku tekstowego
      *  string $file2 lokalizacja plików
      *  int $numeric wybór zadania
      *  return null
      *  0 usuń pliki wskazane w pliku tekstowym
      *  1 zachowaj pliki wskazane w pliku tekstowym
      */
      public function __construct( $file1, $file2, $numeric ){
             $this->file1 = $file1;
             $this->file2 = $file2;
       
     if(is_numeric($numeric)){
         
    $this->numeric = $numeric; 
         
     }else{
       
    $this->error[] = " Podaj prawidłowy parametr Numerik "; 
      
     }   
         }
   /**
   * string $file1
   * sprawdzenie czy plik znajduje się w podanej ścieżce 
   * return boolea
   */
      private function check_dir($file){
     
   //if(file_exists($file1) && is_dir($file1)){
       if(file_exists($file)){
       
         return true;
     
         }else{
     $this->error[] = " Błędna lokalizacja pliku lub folderu ";
          // throw new Exception(" Błędna lokalizacja pliku lub folderu ");
         return false;
          }
       }
        /**
          * plik tekstowy
          * obiekt string $this->file1
          * obiekt array() $this->error
          * obiekt array() $this->Tab
          */
       public function load_text_file(){
           if($this->check_dir($this->file1)){   
                if(is_array(file($this->file1))){
         // czyścimy trim ze śmieci
         $this->Tab = explode(",",implode(',', array_map('trim', file($this->file1))));
                  }else{
                    $this->error[] =" Tablica jest pusta ";
                   }
              }else{
  
               //throw new Exception("Błędna lokalizacja pliku tekstowego");
                 $this->error[] =" Błędna lokalizacja pliku tekstowego ";
              }
        }
     /**
      * obiekt string  $this->file1
      * obiekt array() $this->error
      * obiekt array() $this->Tab1
      */
      public function load_dir(){
           if($this->check_dir($this->file2)){
                // $dir  = dirname(__FILE__) .'/pliki';
        $this->Tab1 = array_diff(scandir($this->file2), array('..', '.'));
                // $this->Tab1 = scandir($this->file2);
              }else{
               //throw new Exception("Błędna lokalizacja pliku tekstowego");
              $this->error[]  =" Błędna lokalizacja pliku tekstowego ";
           }
        }
   /**
    *
    * obiekt array() $this->Tab1
    * obiekt array() $this->Tab
    * obiekt $this->file2
    * obiekt $this->numeric
    * array() $zle_usun
    * array() $dobre
    */
       public function compare_file(){
        if(is_array($this->Tab1)){
    //print_r($this->Tab1);
     //Var_dump($this->Tab);
    // Var_dump($this->Tab1);
    
         foreach($this->Tab1 as $spr){
     
    if(in_array( $spr, $this->Tab )){
                  // echo $spr;
                    $dobre[] = $spr;
    // numeric 0 
    if($this->numeric == 0){
    //  $wyn  = array_merge($this->Tab[0], $this->Tab1);        
                         //  $wyn1 = array_unique( $wyn );
     if($this->check_dir($this->file2)){
                     unlink($this->file2."/".$spr);
              }
           }
                }else{
        // numeric 1 
    if($this->numeric == 1){
                   $zle_usun[] = $spr;
    // Usuwamy pliki zbędne
         //array_map( "unlink", glob(dirname(__FILE__) .'/pliki/*'.$plik.'.clu') );
     if($this->check_dir($this->file2)){
                     unlink($this->file2."/".$spr);
              }
         }
                }
         
       
     }
             } else {
           $this->error[] =" Tablica jest pusta ";
          }
          
         if(!empty($dobre) || !empty($zle_usun)){
      
          $this->error[] ="Usunięto Wszystko OK  "; 
     }else{
    // throw new Exception("Tablica jest pusta");
     $this->error[] =" Usunięto ";
       }     
        }
     /**
      * obiekt string $this->error
      * return obiekt string $this->error
      */
      public function Error(){
          if(!empty($this->error)){
        
       return $this->error;           
            }
    }
}
?>

Plik index.php


load_text_file();
  $pliki->load_dir();
  $pliki->compare_file();
  
  // Wypisujemy błędy
   echo $pliki->Error()[0];
?>

Używamy cookies i podobnych technologii m.in. w celach: świadczenia usług, reklamy, statystyk. Korzystanie z witryny bez zmiany ustawień Twojej przeglądarki oznacza, że będą one umieszczane w Twoim urządzeniu końcowym. Pamiętaj, że zawsze możesz zmienić te ustawienia. To find out more about the cookies we use and how to delete them, see our privacy policy.

I accept cookies from this site.

EU Cookie Directive Module Information