آموزش polymorphism در زبان php

  • خانه
  • آموزش polymorphism در زبان php
Image تحقیقات

آموزش polymorphism در زبان php

با سلام خدمت دوستان عزیز

امروز میخوام یکم درباره polymorphism استفاده کنم . همانطور که می دانید این مفهوم در بین زبان php و دیگر زبان های برنامه نویسی مشترک است و فقط ممکن است از نظر پیاده سازی تفاوت هایی داشته باشند .

در واقع در polymorphism  , یک Method در یک کلاس زیر مجموعه‌ی خودش Override میشه! . یعنی کلاس پدر شامل متدهایی است که کارایی لازم را در کلاس فرزندان ندارد . پس در نتیجه این متدها باید در کلاس فرزندان با همان نام بازنویسی شوند  . این کار چه زمانی اتفاق میافتد ؟ موقعی که متد مورد نظر در کلاس پدر , کارایی نداشه باشد (پس باید به کل بازنویسی شود ) یا متد مورد نظر در کلاس پدر بخشی از نیاز ما را فراهم می کند که باید بقیه نیاز را بازنویسی کنیم .

تعریف دیگری که در سایت ها پیدا می کنید به این صورت است :

According to the Polymorphism principle, methods in different classes that do similar things should have the same name.

و میگه متدهایی که کار مشابه ای را در کلاس های مختلف انجام می دهند باید نام یکسانی داشه باشند . مثلا متدی که برای محاسبه ی محیط دایره است  و متدی که برای محیط مستطیل است چون کار مشابه ای انجام می دهند باید نام یکسانی داشه باشند .(به فرض calcArea )

مثال ۱ :

<?php 
/**
* 
*/
class Human 
{
	
	public $firstName ;
	public $lastName ;
	public $age ;
	public $phone ; 

	public function __construct($firstName , $lastName ,$age , $phone)
	{
		$this->firstName = $firstName ;
		$this->lastName  = $lastName ; 
		$this->age 		 = $age ; 
		$this->phone 	 = $phone ; 
	}

	public function write()
	{
		return 'adsf';
		return $this->firstName . " " . $this->lastName ; 
	}
}

/**
* 
*/
class BoyHuman extends Human
{
	function __construct($firstName , $lastName ,$age , $phone)
	{
		parent::__construct($firstName , $lastName ,$age , $phone); 
	}


	public function write()
	{
		return $this->firstName . " " . $this->lastName ." " . $this->age ; 
	}
	
}

/**
* 
*/
class GirlHuman extends Human
{
	
	function __construct($firstName , $lastName ,$age , $phone)
	{
		parent::__construct($firstName , $lastName ,$age , $phone); 
	}	
	public function write()
	{
		return $this->firstName . " " . $this->lastName . $this->phone ; 
	}
}

در خط ۵ کلاسی تعریف شده به نام Human که در واقع کلاس پدر ما است  و بقیه کلاس ها از این کلاس ارث بری می کنند . یک متد write دارد که نام و نام خانوادگی را چاپ می کند .

در کلاس  های فرزند این متد باز نویسی شده است و  هر کدام مقدار خاصی را به این متد اضافه کردن مثلا در کلاس BoyChild علاوه بر نام و نام خانوادگی , شماره تلفن هم برگشت داشته می شود .

حالا در فایل  index.php می تواینم از این کلاس ها استفاده نماییم و هر کدام که لازم داشتیم فقط کافی است متد write آنها را صدا بزنیم .

<?php 
include_once 'Human.php';
<?php 
include_once 'Human.php';

$boyHuman = new BoyHuman('Alihossein' , 'Shahabi' , '26' , '09121234567');
// echo $boyHuman->write();


$girlHuman = new GirlHuman('Sara' , 'Amini' , '56' , '09128888888');
echo $girlHuman->write(); 
$boyHuman = new BoyHuman('Alihossein' , 'Shahabi' , '26' , '09121234567');
// echo $boyHuman->write();


$girlHuman = new GirlHuman('Sara' , 'Amini' , '56' , '09128888888');
echo $girlHuman->write();

مثال ۲ :

<?php 
/**
 * interface Shape
 */
interface Shape {
  public function calcArea();
}



/**
 * class Circle
 */
class Circle implements Shape {
  private $radius;
   
  public function __construct($radius)
  {
    $this -> radius = $radius;
  }
  
  // calcArea calculates the area of circles 
  public function calcArea()
  {
    return $this -> radius * $this -> radius * pi();
  }
}


/**
 * class Rectangle 
 */
class Rectangle implements Shape {
  private $width;
  private $height;
   
  public function __construct($width, $height)
  {
    $this -> width = $width;
    $this -> height = $height;
  }
  
  // calcArea calculates the area of rectangles   
  public function calcArea()
  {
    return $this -> width * $this -> height;
  }
}

در مثال دوم  از در polymorphism , ما یک فایل داریم به نام Shape.php و داخل این فایل کلاس هامون را تعریف کرده ایم  . ابتدا یه اینترفیس  ایجاد کردیم برای کلاس های که مجبور باشن متد calcArea را در خود داشته باشند  . سپس  برای هر کلاس که از Shape تاثیر میگیرد و implements می شود متد calcArea را ساختیم و محیط را حساب کردیم .

سپس در فایل index.php هر کلاسی که لازم داشتیم را فراخوانی کرده و متد calcArea  آن را صدا زده و قیمت آن را نیز با استفاده از تابع price محاسبه کرده .

<?php 
include_once 'Shape.php';

 function price(Shape $area)
{
	return $area->calcArea() * 250 ; 
	
}

$circ = new Circle(3);
$rect = new Rectangle(3,4);

echo "$" . price($circ);
echo '
';
echo "$" .price($rect);

 

خب مقاله امروز هم به پایان رسید.خوشحال میشم مثل همیشه نظراتتون رو اعلام کنید.