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() {
// کدی اینجا قرار دارد
}
}
?>
برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید. صفحه ورود و ثبت نام