# პოლიმორფიზმის მაგალითი

განვიხილოთ მაგალით სადაც ჩვენს საიტზე გვაქვს მონაცემების შენახვის ორი საშუალება. მაგალითად MySQL მონაცემთა ბაზა და ქეშირება რედისით. სადაც ჩვენი მიზანია რომ შევქმნათ ორი ისეთი კლასი რომ მონაცემთა ბაზის კლასის ობიექტის რედისის კლასის ობიექტით ჩანაცვლებით შეგვეძლოს იმის განსაზღვრა თუ სად შეინახება ჩვენი მონაცემები.

```php
<?php

// ორივეს ფუნქციონალი უნდა შეიცავდეს მონაცემთა ჩაწერასა და წაკითხვას. 
// შესაბამისად მათ ინტერფეისს განვუსაზღვროთ store და fetch მეთოდები.
interface StorageService
{
    public function store($data);
    public function fetch();
}

// მონაცემთა ბაზის კლასი
class DatabaseService implements StorageService
{
    public function store($data)
    {
        // მაგალითის სიმარტივისთვის წარმოვიდგინოთ რომ აქ წერია განხორციელების გზა
        // store data in database Code
        print "data stored \n";
    }
    public function fetch()
    {
        // fetch data from database Code
        print "data fetched \n";
    }
}

// რედისის კლასი ქეშირებისთის
class RedisService implements StorageService
{
    public function store($data)
    {
        // განხორციელების გზა განსხვავდება DatabaseService-ისაგან
        // Cache data  Code
        print "data stored \n";
    }
    public function fetch()
    {
        // fetch Cached data  Code
        print "data fetched \n";
    }
}



// დავუშვათ გვაქვს ფუნქცია რომელსაც გადავცემთ პარამეტრად სერვისს
// StorageService ინტერფეისიდან გამომიდინარე ჩვენ უკვე ვიცით რომ მას აუცილებლად ექნება ->store() მეთოდი
function storeData(StorageService $service){
    $service->store("some Data");
}


// ფუნქციის გამოძახებისას საკმარისია გადავცეთ მას ჩვენი კლასის ინსტანსი
// და შესაბამისად შეიცვლება მთელი ფუნქციონალი
storeData(new DatabaseService()); 

// მაგალითად ამჯერად თუ გინდა ინახებოდეს ქეშში და არა ბაზაში უბრალოდ
// DatabaseService-ს ჩავანაცვლებთ RedisService-ით და ყველაფერი მზადაა
storeData(new RedisService()); 

```
