در این بخش از سری آموزش شی گرایی در PHP می خواهیم مفهوم و استاندارد چندریختی (polymorphism) یا پولی مورفیسم را یاد بگیریم که هدف آن نوشتن کدهایی با توسعه و درک آسان است.
بر اساس استاندارد چندریختی (polymorphism), متدها در کلاس های مختلف باید نام یکسان داشته باشند.
یک مثال ساده کلاس هایی از شکل های هندسی (شبیه مستطیل, مربع, چندضلعی) است که هر کدام از نظر تعداد ضلع ها و محاسبه مساحت متفاوت هستند ولی همه آنها متدهایی برای محاسبه مساحت دارند.
در این موارد, همه متدها فارغ از اینکه چه شکل یا کلاسی است باید نام یکسان داشته باشند.
برای مثال, می توانیم تمامی متدهای محاسبه مساحت برای تمامی کلاس شکل ها را calcArea()
نامگذاری کنیم.
در اینصورت, هنگامی که متد محاسبه را صدا می زنیم دیگر نیاز به توجه زیادی برای اینکه هر شکل چه نام متدی برای محاسبه دارد و چطور کار می کند نخواهیم داشت.
چطور مفهوم چندریختی را در شی گرایی php پیاده کنیم؟
برای اینکه مطمین شویم که کلاس ها مفهوم پولی مورفیسم را رعایت می کنند, می توانیم یکی از دو گزینه کلاس های abstract یا interface را انتخاب کنیم.
برای مثال, اینترفیس با نام Shape
تمام کلاس هایی که آن را implement
می کند, متعد به استفاده از نام calcArea()
داخل کلاس فرزند می کند.
1 2 3 |
interface Shape { public function calcArea(); } |
مطابق همین, کلاس Circle
اینترفیس Shape
را استفاده و از متد با نام calcArea()
برای بدست آوردن مساحت دایره استفاده می کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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(); } } |
کلاس rectangle
نیز اینترفیس Shape
را استفاده می کند ولی متد calcArea()
را با یک فرمول متناسب شکل مستطیل می نویسد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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; } } |
از این کلاس ها یک شی می سازیم :
1 2 |
$circ = new Circle(3); $rect = new Rectangle(3,4); |
حالا می توانیم مطمین شویم جدا از اینکه چه شکلی است, تا زمانی که از اینترفیس Shape
بهره می برند, همه شکل ها یک متد یکسان به نام calcArea()
برای محاسبه مساحت دارند
1 2 |
echo $circ -> calcArea(); echo $rect -> calcArea(); |
نتیجه
۲۸٫۲۷۴۳۳۳۸۸۲۳۰۸
۱۲
جمع بندی
در این سری از آموزش شی گرایی در PHP با مفهوم چندریختی (polymorphism) در PHP آشنا شدید.
در بخش بعدی با type hinting آشنا می شود که به ما کمک می کند توابع و متدها را مجاب به استفاده فقط یک نوع داده خاص کنیم.