تعداد بازدید: 1185

شی گرایی در php (قسمت سوم)

در این مقاله قصد داریم تا مباحث زیر رو بررسی کنیم:

  • Polymorphism
  • Abstract
  • Interface

مباحث encapsulation , polymorphism , abstrac , interface تکنیک هایی هستند جهت استفاده هر چه بهتر شی گرایی در پی اچ پی.(و همه موارد به از مبحث وراثت کمک می گیرند).

چندریختی یا Polymorphism

یعنی استفاده از وراثت برای پیاده سازی ساختار های مشابه و با تفاوت های کوچک . مثلا حیوان ، گربه ، سگ

<?php
class Animal {
    public function sound() {
        echo "animal sound<br>";
    }
}
class Cat extends Animal {
    public function sound() {
        echo "miaw<br>";
    }
}
class Dog extends Animal{
    public function sound() {
        echo "arab<br>";
    }
}
$Animal1 = new Cat();
$Animal1->sound();

به طور کلی چند ریختی میگه به جای اینکه بخوای برای هر کدوم از حیوانات متد جداگانه ای بنویسی یک متد واحد بنویس و پیاده سازی های متفاوتی انجام بده.

در مثال بالا می تونستیم در کلاس Animal یک متد برای صدای گربه ، یک متد برای صدای سگ بنویسیم که این کار پلشتی هست و بهتره برای هر حیوان یک کلاس فرزند بسازیم و با یک متد واحد اون رو مدیریت کنیم.

این مفهوم در ادامه مفهوم وراثت می آید یعنی override کردن متد ها در کلاس های فرزند.

انتزاع یا Abstract

معنی کلمه لغوی abstrac یعنی چکیده . خوب از معنیش میشه حدس زد در چه رابطه ای است.

در abstract ما یه سری متدها رو نامشون رو می نویسیم و از کاربر می خوایم که توی کلاس فرزندی که میسازه بیاد و متدهای خلاصه ما رو تکمیل کنه.

در abstract (بر خلاف interface) هم میتونیم متد کامل (همراه با بدنه ) داشته باشیم و هم متد خلاصه .

<?php
abstract class Car {
    abstract protected function start($car_name);
    abstract protected function run();
    public function take_off(){
        echo "car is taking off";
    }
}
/**
 * all abstract method must be define
 * you can add parameter to function in child class but you must be define default value for this
 */
class Cadilac extends Car{
    public function start($carname , $seprator = '<br>'){
        echo "{$carname} cadilac is start {$seprator}";
    }
    public function run() {
        echo "cadilac is running";
    }
}
$cadi1 = new Cadilac();
$cadi1->start('sclidCadi', '<hr>');

همون طور که در کد مشخصه :

  • تمامی متدهای خلاصه ای که در کلاس والد abstract نوشته شده باید در کلاس های فرزندش تعریف بشه (اگر نشه خطا میده)
  • شما می تونید پارامتر های جدیدی برای متد تکمیل شده در کلاس فرزند تعریف کنید.

نکات syntax :

  • قبل از کلاس باید کلمه کلیدی abstract باشه.
  • قبل از متدهای مربوطه باید کلمه کلیدی abstract باشه.

interface

interface ماهیتی شبیه به abstract داره با این تفاوت که در interface ها نمیتونیم متد با بدنه تعریف کنیم و باید تمامی متدهامون به صورت خلاصه باشند.

interface method can not have body

<?php
/**
 * interface implement
 * you can not declare protected method in interface class
 */
interface Car{
   public function start($carname);
}
/**
 * you must declare all method in interface element
 */
class Cadilac implements Car{
    public function start($carname){
        echo "{$carname} is start";
    }
}

نکته : یکی از مهم ترین استفاده های abstract و  interface پیاده سازی سیستم های ماژولار هست. بهترین راه برای این که ما یه سری قوانین وضع کنیم تا برنامه نویسان سوم شخص که میان برای نرم افزار ما ماژول می نویسند راحت تر باشند اینه که از این ساختمان داده ها استفاده کنیم.

به طور مثال ما پلاگین نوشتیم برای پرداخت دلخواه . در اون میخواهیم یه روال بنویسیم که برنامه نویسای دیگه بیان و سایر درگاه ها رو براش پیاده سازی کنن.

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

مثلا متد start برای ارسال کاربر به درگاه و متد verify برای تایید پرداخت و متغیر amount برای مبلغ و …. که باید با توجه به پلاگین تعیین بشه(نوع پیاده سازی هم خیلی مهمه).

نکاتی در رابطه با syntax

  • ما در abstract از کلمه کلیدی extends برای ساخت فرزند استفاده می کنیم.
  • در interface ها ما کلمه کلیدی interface رو جایگزین کلمه کلیدی class می کنیم .(کلمه کلیدی class نداریم)
  • در interface ها از کلمه کلیدی implements برای ساخت فرزندان تکمیل کننده استفاده می کنیم.

نتیجه گیری : abstract و interface تقریبا یه نوع وراثت ساختاربندی شده هستند ، یعنی کاربری که کلاس فرزند رو میسازه مجبور به انجام یه سری کارها می کنه . همچنین میشه با تبدیل یه کلاس بزرگ به کلاس های کوچیک با interface ساختار کدمون رو قابل فهم تر کنیم. (که یکی از رسالت های شی گرایی هم همین قابل فهم تر کردن کدها برای ماست)

مطالب مشابه

هدر های Http در درخواست و پاسخ

Http Headers (قسمت دوم)

http headers حاوی اطلاعاتی در رابطه با نوع درخواست ما می باشند. همچنین یک نوع رابط میان درخواست کلاینت و پاسخ سرور در...

email handling in php

ارسال و دریافت ایمیل در php

قوانین حکم فرما بر دنیای وب را پروتکل می نامیم. پروتکل http که در سرور ها برای ایجاد پاسخ به درخواست ها در برخی...

php socket programming

PHP Socket Programming – Part2

برنامه نویسی سوکت فرآیندی است که در آن یک یا چند کلاینت از طریق پورت یکسان یا متفاوت به سرور متصل می شوند و این اتصال...

هدر های Http در درخواست و پاسخ

Http Headers (قسمت سوم)

Http Request و Http Response درخواست و پاسخ بر اساس پروتکل Http می باشند و می توان از این ها برای ارتباط میان نرم افزار...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای شی گرایی در php (قسمت سوم)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *