PHP Nesne Tabanlı Programalamada arayüz oluşturmak yaptığınız projelerde ve PHP MVC yazılımlarda önemli yer tutmaktadır. Birlikte bizde örnek bir php interface (Arayüz) oluşturalım. Öncelikle arayüz oluşturulacak sınıflarda yönlendirici olarak tanımlanmaktadır. Metotların public olarak tanımlanması gerekmetedir. Bu sınıfta tanımlanan metodlar mirasçı alt sınıflarda da tanımlanmak zorundadır. Bu sınıflar interface className{} şeklinde tanımlanırlar ve kendinden sonra gelen sınıflarada implements operatörü kullanılır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | interface sayfa{ public function sayfaGoster($sayfaBaslik,$icerikBaslik,$icerik); //üç parametreli bir arayüz metod yadık. public function test($veri); } abstract class db implements sayfa{ private $data; private $user; private $pass; private $dbBag; private $veri; function __construct($dbName,$userName,$userPass){ //Sınıf oluşturulurken parametre gönderilmesini istedik $this->data=$dbName; $this->user=$userName; $this->pass=$userPass; //sınıf çağırılırken sınıfı içerisindek değikenlere //göndermiş olduğumuz parametler eklenecek echo "Bağlantı açıldı. <br />"; try{ $this->dbBag=new PDO("mysql:host=localhost;dbname=$this->data;charset=utf8",$this->user,$this->pass); //veri tabanı bağlantısını kurduk $this->dbBag->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //hata ayıklama metodumuzu belirttik. }catch(PDOException $x){ echo $x->getMessage(); //hata olursa mesaj alacağız } } public function veriCek($tablo,$id){ $sonuc=$this->dbBag->query("select * from {$tablo} where id={$id}",PDO::FETCH_NUM); //veri tabanı bağlantısı olan değişkeni çağırdık ve sql gönderdik return $sonuc->fetchAll(); //tüm verileri bir seferde alıp geriye dönderdik. } public function test($veri){} public function sayfaGoster($sayfaBaslik,$icerikBaslik,$icerik){ return ' <!DOCTYPE html> <html lang="en"> <head> <title>'.$icerikBaslik.'</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class="jumbotron"> <h1>'.$sayfaBaslik.'</h1> </div> <div class="col-md-12"> <h1 class="badge badge-dagner">'.$icerikBaslik.'</h1> <hr /> <div>'.$icerik.'</div> </div> </div> </body> '; //görütünüleyeceğimiz sınıfın içeriğini yazdık ve parametrelerini oluşturduk. } public abstract function tabloVerikCek($tablo,$id); //abstract metod tanımladık ki diğer bütün sınıflarda kullancağız sql göndereceğiz public abstract function tabloVeriYaz(); //abstract metod tanımladık ki diğer sınfılarda aldığımız verileri ekrana basalım function __destruct(){ $this->dbBag=null; //veri tabanını kapattık echo "<br />Veri tabanı bağlantısı kapandı"; } } class userInfo extends db{ //userInfo tablosu için sınıf oluşturduk ve db sınıfında miras aldık public function __construct(){ parent::__construct("testdata","root",""); //db sınıfını ön yükleyicisini çalıştırdık. } public function tabloVerikCek($tablo,$id){ $this->veri=$this->veriCek($tablo,$id); //db sınıfında tanımladığımız abstract metodu ile sanki db sınıfı içerisinde gibi //gibi this-> metodu ile metodu çağırdık. } public function tabloVeriYaz(){ $this->veri; //Buradaki $this->veri değişkeni db sınıfınındır //abstark metodu sayesinde her sınıfta kullanacağız } public function icerik(){ echo parent::sayfaGoster("Çağlar Hoca", $this->veri[0][1] ,$this->veri[0][2]); //interface tanımlanan sonra db sınıfında oluşturulan sayfagöster metoduna verileri parametre olarak gönderdik. } } $icerikDb=new userInfo(); //sınıfı çağırdık $icerikDb->tabloVerikCek("icerik",2); //veri tabnından içeriği çektik $icerikDb->icerik(); //interface sınıfında tanımladığımız sonra abstract db sınıfında içeriğini yazdığımız ve son olarak userinfo sınıfında //çağırdığımız içerik() metodunu çalıştırkdık. |
PHP Adaptör Tasarım Deseni (Adapter Design Pattern) Kullanımı
Daha önce oluşturulmuş bir interface arayüze sonradan metod eklemeye çalışıldığında problem yapanmaktadır. Bunun için daha önceden oluşturlan arayüzü extends ederek yeni arayüz oluşturuyoruz ve daha önceki arayüzde ki metotları miras alarak yeni arayüzde yeni metodlarıda ekleyip sınıflar oluşturuyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | interface arayuz_1{ public function userName($userName); } class araYuzIcerik_1 implements arayuz_1{ function __construct(){ echo "class araYuzIcerik_1 implements arayuz_1 Çalıştır.<br />"; } public function userName($userName){ echo "<h1>Hoş geldin : ".$userName."</h1>"; } } $arayuzfirst=new araYuzIcerik_1(); $arayuzfirst->userName("Çağlar Bostancı"); echo "Arayüze tekerar ekleme yapıldı"; interface arayuz_2 extends arayuz_1{ public function userInfo($bilgiler); } class araYuzIcerik_2 extends araYuzIcerik_1 implements arayuz_2{ public function userInfo($userInfo){ echo "<table border=\"1\">"; foreach($userInfo as $index=>$veri){ echo "<tr><td>{$index}</td><td>{$veri}</td></tr>"; } echo "</table>"; } } $arayuzlast=new araYuzIcerik_2(); $arayuzfirst->userName("Çağlar Bostancı"); $veriler=array("Dogum-Tarihi"=>"1988","Yas"=>31,"Dogum-Yeri"=>"KIRŞEHİR"); $arayuzlast->userInfo($veriler); |
PHP Decorate Design Pattern
Oluşturulmuş bir sınıfı başka bir sınıfın içerisinde kullanılması durumudur.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | class siirler{ public $icerik; public $yazar; public function setYazar($yazar){ $this->yazar=$yazar; } public function getYazar(){ echo $this->yazar; } public function setEser($baslik,$icerik){ $this->icerik=" <h3>{$baslik}</h3> {$icerik} "; } public function getEser(){ echo $this->icerik; } function icerikDate(){ date_default_timezone_set('Europe/Istanbul'); echo date('d.m.Y H:i:s'); } } class edebi{ public $disSinif; function __construct(siirler $sinif){ $this->disSinif=$sinif; } public function eserYaz(){ $this->disSinif->getEser(); echo "<hr /><b style='text-decoration:underline'>"; $this->disSinif->getYazar(); echo "</b>"; } } $sinif_1=new siirler(); $sinif_1->setYazar("Ümit Yaşar Oğuzcan"); $siir=' Aşk başlamadan güzel, Kalplerde heyecan Bakışlarda korku olduğu zaman güzel... Birbirimize sezdirmemek için çırpınış, Başkaları görmesin diye çabalayış, Gözlerim gözlerinin mavisine değdiği zaman... '; $sinif_1->setEser($sinif_1->getYazar(),$siir); //$sinif_1->getEser(); $sinif_2=new edebi($sinif_1); $sinif_2->eserYaz(); |
PHP Factory Design Pattern
Daha önce oluşturulmuş sınıfları daha kısa bir şekilde oluşturarak geri dönmesi durumu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | class umitYasarOguzcan{ function yazarAdi(){ echo "Ümit Yaşar Oğuzcan"; } function siir(){ echo "Acılar Denizi"; } } class nazimHikmetRan{ function yazarAdi(){ echo "Nazım Hikmet Ran"; } function siir(){ echo "Bence Şimdi Sen De Herkes Gibisin"; } } class createSinif{ public static function sinifCagir($variable){ switch ($variable) { case 'yazar-1': $yazar=new umitYasarOguzcan(); return $yazar; break; case 'yazar-2': $yazar=new nazimHikmetRan(); return $yazar; break; default: exit("Tanimsiz Sinif"); break; } } } $sinif_1=createSinif::sinifCagir("yazar-1"); $sinif_1->yazarAdi(); echo "<br />"; $sinif_1->siir(); |
Başarılar.