PHP – وراثت (Inheritance)

PHP - وراثت چیست؟

وراثت در شیء‌گرایی به این معناست که یک کلاس از کلاس دیگری مشتق می‌شود.

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

یک کلاس مشتق‌شده با استفاده از کلمه کلیدی extends تعریف می‌شود.

بیایید به یک مثال نگاه کنیم:

مثال

<?php
class Fruit {
  public $name;
  public $color;
  public function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  public function intro() {
    echo "The fruit is {$this->name} and the color is {$this->color}.";
  }
}
// Strawberry از Fruit به ارث برده است
class Strawberry extends Fruit {
  public function message() {
    echo "Am I a fruit or a berry? ";
  }
}
$strawberry = new Strawberry("Strawberry", "red");
$strawberry->message();
$strawberry->intro();
?>

توضیح مثال

کلاس Strawberry از کلاس Fruit به ارث برده است. این بدان معناست که کلاس Strawberry می‌تواند از ویژگی‌های عمومی name و color و همچنین متدهای عمومی __construct() و intro() استفاده کند. کلاس Strawberry همچنین متد خود به نام message() را دارد.

PHP - وراثت و مودیفایر دسترسی محافظت‌شده

در فصل قبلی یاد گرفتیم که ویژگی‌ها یا متدهای محافظت‌شده می‌توانند درون کلاس و توسط کلاس‌های مشتق‌شده از آن کلاس دسترسی یابند. این به چه معناست؟

بیایید به یک مثال نگاه کنیم:

مثال

<?php
class Fruit {
  public $name;
  public $color;
  public function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  protected function intro() {
    echo "The fruit is {$this->name} and the color is {$this->color}.";
  }
}
class Strawberry extends Fruit {
  public function message() {
    echo "Am I a fruit or a berry? ";
  }
}
// تلاش برای فراخوانی تمام متدها از خارج کلاس
$strawberry = new Strawberry("Strawberry", "red");  // درست. __construct() عمومی است
$strawberry->message(); // درست. message() عمومی است
$strawberry->intro(); // خطا. intro() محافظت‌شده است
?>

در مثال بالا می‌بینیم که اگر سعی کنید یک متد محافظت‌شده (intro()) را از خارج کلاس فراخوانی کنید، خطایی دریافت خواهید کرد. متدهای عمومی به درستی کار خواهند کرد!

بیایید به مثال دیگری نگاه کنیم:

مثال

<?php
class Fruit {
  public $name;
  public $color;
  public function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  protected function intro() {
    echo "The fruit is {$this->name} and the color is {$this->color}.";
  }
}
class Strawberry extends Fruit {
  public function message() {
    echo "Am I a fruit or a berry? ";
    // فراخوانی متد محافظت‌شده از داخل کلاس مشتق‌شده - درست
    $this->intro();
  }
}
$strawberry = new Strawberry("Strawberry", "red"); // درست. __construct() عمومی است
$strawberry->message(); // درست. message() عمومی است و intro() (که محافظت‌شده است) را از داخل کلاس مشتق‌شده فراخوانی می‌کند
?>

متدهای به ارث رسیده می‌توانند با تعریف مجدد (استفاده از همان نام) در کلاس فرزند بازنویسی شوند.

به مثال زیر نگاه کنید. متدهای __construct() و intro() در کلاس فرزند (Strawberry) متدهای __construct() و intro() در کلاس والد (Fruit) را بازنویسی می‌کنند:

PHP - بازنویسی متدهای به ارث رسیده

کلمه کلیدی final می‌تواند برای جلوگیری از وراثت کلاس یا جلوگیری از بازنویسی متدها استفاده شود.

مثال زیر نشان می‌دهد که چگونه می‌توان از وراثت کلاس جلوگیری کرد:

مثال

<?php
class Fruit {
  public $name;
  public $color;
  public function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  public function intro() {
    echo "The fruit is {$this->name} and the color is {$this->color}.";
  }
}
class Strawberry extends Fruit {
  public $weight;
  public function __construct($name, $color, $weight) {
    $this->name = $name;
    $this->color = $color;
    $this->weight = $weight;
  }
  public function intro() {
    echo "The fruit is {$this->name}, the color is {$this->color}, and the weight is {$this->weight} gram.";
  }
}
$strawberry = new Strawberry("Strawberry", "red", 50);
$strawberry->intro();
?>

PHP - کلمه کلیدی final

کلمه کلیدی final می‌تواند برای جلوگیری از وراثت کلاس یا جلوگیری از بازنویسی متدها استفاده شود.

مثال زیر نشان می‌دهد که چگونه می‌توان از وراثت کلاس جلوگیری کرد:

مثال

<?php
final class Fruit {
  // کدی اینجا قرار دارد
}
// منجر به خطا خواهد شد
class Strawberry extends Fruit {
  // کدی اینجا قرار دارد
}
?>

مثال زیر نشان می‌دهد که چگونه می‌توان از بازنویسی متدها جلوگیری کرد:

مثال

<?php
class Fruit {
  final public function intro() {
    // کدی اینجا قرار دارد
  }
}
class Strawberry extends Fruit {
  // منجر به خطا خواهد شد
  public function intro() {
    // کدی اینجا قرار دارد
  }
}
?>

پست های مرتبط

مطالعه این پست ها رو از دست ندین!
JavaScript - رویدادها (Events)

JavaScript – رویدادها (Events)

رویدادهای HTML رویدادها در HTML، “اتفاقاتی” هستند که برای عناصر HTML رخ می‌دهند. این اتفاقات می‌توانند ناشی از کار...

بیشتر بخوانید
JavaScript - سازنده‌های شیء (Object Constructors)

JavaScript – سازنده‌های شیء (Object Constructors)

ساخت آبجکت با تابع سازنده (Object Constructor Function) برای ساخت چندین آبجکت مشابه، از تابع سازنده استفاده می‌شود. این...

بیشتر بخوانید
JavaScript - نمایش شیء (Object Display)

JavaScript – نمایش شیء (Object Display)

نحوه نمایش آبجکت‌ها در جاوااسکریپت هنگام نمایش یک آبجکت جاوااسکریپت به صورت مستقیم، خروجی معمولاً به شکل [object Object]...

بیشتر بخوانید

نظرات

سوالات و نظراتتون رو با ما به اشتراک بذارید

برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید.