Eyl.26

PHP OOP (Nesne Yönelimli Programlama) Ders 9 : OOP’de Temel Prensipler – Polymorphism (Çok Biçimlilik)

Kalıtım yaklaşımının biraz daha iç içe geçmiş ve karmaşık gibi görünen halidir. Adından da anlaşılacağı üzere, üretilen alt sınıfların başkalaşım geçirerek farklı farklı görevler üstlenmesini saplar. Ana Class’ın özelliklerini almak ve gerektiğinde değiştirebilmek olarak da tanımlanabilir.

Şöyle bir örnek düşünelim. Ana Class’ımızın amacı alan hesabı yapmak olsun. Bildiğiniz gibi üçgen, kare, daire gibi bir takım geometrik şekiller vardır. Bunların hepsinin de alan hesabı birbirinden farklı. Ama görüntü itibari ile yaptıkları görev alan bulmak. Az önce bahsetmiş olduğumuz gibi ana sınıftan alınan bir metot, yani fonksiyon, ihtiyaca göre değiştirilebilir. Kare için a*a formülü uygulayabilirken, dikdörtgen için de a*b uygulanacak. Bu mantıkla metodumuzun işlem türünü değiştirebiliriz.

Bu örneğimizi bir de HTML5 formu ile birleştirelim…

<!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8">
      <title>ALAN HESAPLA</title>
   </head>
   <body>
     <div>
       <p>Kare Alanı Hesapla</p>
       <form action="polymorphism.class.php" method="POST">
          a: <input type="text" name="kenar_uzunlugu" size="3" >
             <input type="submit" name="submitKare" value="Hesapla">
       </form>
     </div>
     <hr>
     <div>
       <p>Daire Alanı Hesapla</p>
       <form action="polymorphism.class.php" method="POST">
          r: <input type="text" name="yaricap_uzunlugu" size="3" >
             <input type="submit" name="submitDaire" value="Hesapla">
       </form>
     </div>
     <hr>
   </body>
</html>
<!-- Buraya kadar form sayfamız HTML5 sayfası olarak hazırlandı -->

<?php
# soyut bir Sekil ana Class'ı oluşturuyoruz.
	class Sekil {
# iki adet parametre alacağız. x ve y;
# bunlardan x olanına kare uzunluğu ve daire yarıçap değerleri gelecek.
# y değerine de 3.14 olan PI değeri gelecek.
		private $x = 0;
		private $y = 0;
# yapıcı metot ile bu Class içindeki alan fonksiyonunu çağırıyoruz.
# self:: anahtar kelimesi ile kendi Class'ı içindeki alan fonksiyonu belirtiyoruz.
		function __construct(){
			self::alan();
		}
# sayfa açıldığında bu mesaj formun altında yer alacak.
# sayfanın sonuna bakarsanız $mesaj = new Sekil(); ile Class'ın başlatıldığını göreceksiniz.
		public function alan() {
			echo "Alan hesabını yapmak için değer girin ve Hesapla butonuna basınız.<br>";
		}
	}
# Sekil Class'ından Kare adında alt Class tanımlanıyor.
	class Kare extends Sekil {
# yapıcı metot ile hemen başlatılıyor.
		function __construct($x) {
# parametre değeri alınıyor.
			$this->x = $x;
		}
# Karenin alanı hesaplanıp return olarak gönderiliyor.
		function alan() {
			echo "Karenin alanı: " .$this->x * $this->x;
		}
	}	
# Sekil Class'ından Daire adında alt Class tanımlanıyor.
	class Daire extends Sekil {
# parametre değeri alınıyor.
		function __construct($x, $y) {
			$this->x = $x;
			$this->y = $y;
		}
# Dairenin alanı hesaplanıp return olarak gönderiliyor.
		function alan() {
			echo "Dairenin alanı: " . $this->x * $this->x * $this->y / 4;
		}
	}
# BURAYA DİKKAT 
# form sayfamızda 2 adet submit, yani Hesapla butonumuz var.
# butonların name özelliğine bakarak if döngülerimizi kuruyoruz.
# eğer submitKare veya submitDaire değerlerinden biri varsa
# onla ilgili kod bloğu çalıştırılıyor.
# kod bloklarında birer alt Class tanımlanıyor.
# parametre değerleri gönderiliyor.
# sonra da alan metotları çağırılıyor.
	if (isset($_POST["submitKare"])) {
		$alanKare = new Kare($_POST["kenar_uzunlugu"]);
		$alanKare->alan();
	} else if (isset($_POST["submitDaire"])) {
		$alanDaire = new Daire($_POST["yaricap_uzunlugu"], "3.14");
		$alanDaire->alan();
	} else {
# ana Class'taki alan metodu çağırılıyor.
		$mesaj = new Sekil();
	}
?>

Kodlarımızı ilk çalıştırdığımızda aşağıdaki gibi bir sayfa görürüz.

Daire için 5 yarıçap değerini verip Hesapla butonuna bastığımızda da aşağıdaki gibi bir sonuç alırız.

İç içe Class’larla çalışırken, yani kalıtım uygularken, ana Class’taki metotlara erişmek için parent:: , kendi Class’ı içindeyken bir metota erişmek için de self:: kullanmanız gerektiğini, her yerden erişilebilir bir değişken oluşturmak için de değişkenin başına global yazmayı unutmayın..

İçeriği paylaş:
  • facebook
  • twitter