آموزش برنامه نویسی PHP-جلسه هجدهم

آموزش برنامه نویسی PHP-جلسه هجدهم

در طراحی توابع یا شی‌ها نیاز داریم فانکشن هایی داشته باشیم که کارکرد متفاوتی داشته باشند ولی اسامی یکسانی داشته باشند. این فانکشن در کلاس مادر وجود دارد که در طول برنامه توسط بچه‌های والد کارایی تابع را تعیین می‌کنند.

Abstract Class در PHP چیست؟

در برنامه‌نویسی شیءگرا (OOP) در PHP، کلاس‌های انتزاعی (Abstract Classes) یکی از ابزارهای مهم برای طراحی ساختار منظم و قابل توسعه در پروژه‌ها هستند. زمانی که چند کلاس مختلف ویژگی‌ها و رفتارهای مشترکی دارند، می‌توانیم یک کلاس پایه ایجاد کنیم و بخش‌های مشترک را در آن قرار دهیم.

کلاس Abstract معمولاً زمانی استفاده می‌شود که بخواهیم یک قالب یا چارچوب کلی برای کلاس‌های فرزند تعریف کنیم، اما نخواهیم از کلاس والد به‌صورت مستقیم یک Object ایجاد شود.

برای تعریف یک کلاس انتزاعی، از کلمه کلیدی abstract استفاده می‌کنیم:

abstract class Car
{
    // Properties and methods
}

یکی از ویژگی‌های مهم کلاس Abstract این است که نمی‌توان مستقیماً از آن Object ساخت و برای استفاده از آن باید یک کلاس دیگر از آن ارث‌بری کند.


چرا از Abstract Class استفاده می‌کنیم؟

فرض کنید در یک پروژه با انواع خودروها کار می‌کنیم. خودروهای مختلفی مانند Audi، Volvo و Citroen داریم. همه این خودروها یک سری ویژگی‌های مشترک دارند؛ برای مثال همه آن‌ها یک نام دارند و می‌توانند یک معرفی مشخص داشته باشند.

به جای اینکه ویژگی‌های مشترک را در هر کلاس تکرار کنیم، می‌توانیم یک کلاس Abstract به نام Car ایجاد کنیم.

در این حالت:

  • Car کلاس پایه خواهد بود.
  • Audi، Volvo و Citroen کلاس‌های فرزند هستند.
  • ویژگی‌های مشترک در Car قرار می‌گیرند.
  • هر کلاس فرزند می‌تواند رفتار مخصوص خودش را پیاده‌سازی کند.

این روش باعث کاهش تکرار کد و ایجاد ساختاری منظم‌تر در پروژه می‌شود.


نحوه تعریف Abstract Class در PHP

برای ایجاد یک کلاس انتزاعی کافی است قبل از class از کلمه کلیدی abstract استفاده کنیم:

abstract class Car
{
    public $name;
}

کلاس Abstract می‌تواند شامل موارد مختلفی مانند:

  • Property
  • Method
  • Constructor
  • Abstract Method
  • متدهای معمولی

باشد.

اما اگر یک متد را به صورت abstract تعریف کنیم، کلاس‌های فرزند موظف هستند آن متد را پیاده‌سازی کنند.


Abstract Method چیست؟

متدی که فقط تعریف می‌شود و بدنه‌ای ندارد، Abstract Method نام دارد.

برای مثال:

abstract public function intro(): string;

در اینجا مشخص کرده‌ایم که هر کلاسی که از کلاس Car ارث‌بری می‌کند، باید متدی به نام intro داشته باشد که یک مقدار از نوع string برگرداند.

Abstract Method در کلاس والد پیاده‌سازی نمی‌شود، بلکه پیاده‌سازی آن به کلاس‌های فرزند واگذار می‌شود.


پیاده‌سازی Abstract Class با مثال

در مثال زیر یک کلاس Abstract به نام Car ایجاد کرده‌ایم:

<?php

abstract class Car
{
    public $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    abstract public function intro(): string;
}

در این کلاس یک Property به نام name داریم که نام خودرو را نگهداری می‌کند.

همچنین یک Constructor داریم که هنگام ایجاد Object از کلاس فرزند اجرا می‌شود و نام خودرو را دریافت می‌کند.

در نهایت متد intro را به صورت Abstract تعریف کرده‌ایم.

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


ایجاد کلاس‌های فرزند از Abstract Class

حالا سه کلاس به نام‌های Audi، Volvo و Citroen ایجاد می‌کنیم:

class Audi extends Car
{
    public function intro(): string
    {
        return "Choose German quality! I'm an $this->name!";
    }
}

class Volvo extends Car
{
    public function intro(): string
    {
        return "Proud to be Swedish! I'm a $this->name!";
    }
}

class Citroen extends Car
{
    public function intro(): string
    {
        return "French extravagance! I'm a $this->name!";
    }
}

هر سه کلاس با استفاده از extends از کلاس Car ارث‌بری کرده‌اند.

از آنجا که Car دارای متد Abstract به نام intro است، هر سه کلاس فرزند باید این متد را پیاده‌سازی کنند.

نکته مهم این است که اگر یکی از کلاس‌های فرزند متد Abstract را پیاده‌سازی نکند، آن کلاس نیز باید به صورت Abstract تعریف شود.


ساخت Object از کلاس‌های فرزند

همان‌طور که گفتیم، امکان ایجاد Object مستقیم از کلاس Abstract وجود ندارد.

بنابراین به جای:

$car = new Car("Car");

باید از کلاس‌های فرزند Object ایجاد کنیم:

$audi = new Audi("Audi");
$volvo = new Volvo("Volvo");
$citroen = new Citroen("Citroen");

سپس می‌توانیم متد intro() را اجرا کنیم:

echo $audi->intro();
echo "<br>";

echo $volvo->intro();
echo "<br>";

echo $citroen->intro();

خروجی برنامه چیزی شبیه به این خواهد بود:

Choose German quality! I'm an Audi!
Proud to be Swedish! I'm a Volvo!
French extravagance! I'm a Citroen!

در این مثال، کلاس Car ساختار کلی را مشخص کرده است، اما هر کلاس فرزند رفتار مخصوص خودش را برای متد intro() ارائه می‌دهد.


تفاوت Class معمولی و Abstract Class

یکی از تفاوت‌های اصلی کلاس معمولی و Abstract Class این است که از کلاس معمولی می‌توان مستقیماً Object ساخت:

class Car
{
}

$car = new Car();

اما از کلاس Abstract نمی‌توان مستقیماً Object ساخت:

abstract class Car
{
}

$car = new Car();

کد بالا باعث ایجاد خطا می‌شود.

بنابراین Abstract Class بیشتر برای تعریف ساختار پایه کلاس‌های دیگر مورد استفاده قرار می‌گیرد.


Abstract Class و ارث‌بری

Abstract Class معمولاً در کنار مفهوم Inheritance یا ارث‌بری استفاده می‌شود.

برای مثال:

abstract class Animal
{
    abstract public function makeSound();
}

class Dog extends Animal
{
    public function makeSound()
    {
        return "
اشتراک گذاری :
مریم گوهرزاد
نویسنده

مریم گوهرزاد

مدرس و بنیانگذار هلدینگ آرتا رسانه. برنامه نویس و محقق حوزه بلاکچین و توسعه‌دهنده بلاکچین | متخصص Solidity | توسعه‌دهنده وب Full-Stackمن یک توسعه‌دهنده علاقه‌مند به فناوری‌های بلاکچین و وب ۳ هستم و در زمینه Solidity، توسعه قراردادهای هوشمند و ساخت برنامه‌های غیرمتمرکز (DApps) فعالیت می‌کنم. تمرکز من بر طراحی و پیاده‌سازی راهکارهایی است که در کنار بهره‌گیری از فناوری‌های نوین، عملکرد مناسب، امنیت و تجربه کاربری مطلوبی ارائه دهند.در کنار تخصص در حوزه بلاکچین، به عنوان یک توسعه‌دهنده وب Full-Stack نیز در طراحی و توسعه وب‌سایت‌ها و برنامه‌های تحت وب فعالیت می‌کنم. تجربه کار در بخش‌های Front-End و Back-End به من این امکان را داده است که پروژه‌ها را از مرحله ایده و طراحی تا توسعه و اجرا، با دیدی جامع دنبال کنم. در فرآیند توسعه، توجه ویژه‌ای به کدنویسی تمیز، معماری مناسب، طراحی واکنش‌گرا، عملکرد مطلوب و تجربه کاربری روان دارم.

TEST_VALUE_123
https://t.me/artarasaneh
tel:09193426251
https://wa.me/+989193426251
https://instagram.com/artarasaneh_com