‎‎وراثتPHP OOP-‎Inheritance

Previous >    <Next  

‎‎وراثت چيستPHP-‎ Inheritance-‎

‎وراثت درoop بدين معني است كه وقتي كلاسي از كلاس ديگر مشتق ميشود، چه مواردي را از آن ‎كلاس مبنا در يافت ميكند .كلاس مبنا را كلاس والد ومشتق شده را فرزند مي ناميم.

‎كلاس فرزند تمام خصوصيات ومتدهاي عمومي وحفاظت شده (public and protected) ‎را از ‎والد خود دريافت ميكند .كلاس والد ميتواند خواص ومتدهاي خاص خود را هم داشته باشد.

‎‎براي يك كلاس وارث از كلمه كليدي‎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 is inherited from 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();
?>

--(go to editor for change code and run)

‎‎شرح مثال

‎كلاسStrawberry با استفاده از كلاسfurit ايجاد شده است .يعني كلاس فوق وارث كلاس furit ‎ميباشد.

‎در نتجه كلاسstrawberry ميتواند از ويژگي هاي‎$name‎ و ‎$color‎‎مطابق اصولpublic ‎استفاده نمايد.متدهاي‎ __construct()‎ , into()‎ ‎ ‎را از كلاسfruit بارث ميبرد .

‎‎كلاسstrawberry خود داراي متد‎ message()‎‎ ميباشد.

‎‎وراثت با اصلاح كنندهprotected

‎ويژگي ها ومتد‎protected‎ را در بخش قبلي مطرح نموديم، كه فقط در كلاس ‎استفاده ميشوند .در اينجا هم كلاس جديد وارث همين رفتار ميباشد.

‎‎مثال ـ براي درك بهتر بمثال توجه كنيد.

<?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? ";
  }
}

// Try to call all three methods from outside class
$strawberry = new Strawberry("Strawberry", "red");  // OK. __construct() is public
$strawberry->message(); // OK. message() is public
$strawberry->intro(); // ERROR. intro() is protected
?> 

--(go to editor for change code and run)

‎چون تابعintro()‎ بصورت ‎protected‎ ميباشد نميتوان خارج از كلاس استفاده ‎نمود، براي همين در اجرا براي استفاده ازآنFtal Error ‎ميدهد .حال بمثال ديگري توجه كنيد.

‎‎مثال ـ تابع مربوطه در داخل كلاس استفاده ميشود.

<?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? ";
    // Call protected method from within derived class - OK
    $this -> intro();
  }
}

$strawberry = new Strawberry("Strawberry", "red"); // OK. __construct() is public
$strawberry->message(); // OK. message() is public and it calls intro() (which is protected) from within the derived class
?> 

--(go to editor for change code and run)

‎‎‎اين مثال درست كار ميكند، چون قانون‎protected‎ رعايت شده است .

‎‎صرفنظر موردي وارثتPHP-‎Overriding inherited Method -‎

‎در صورتيكه بخواهيم متدي را از والد بارث نرسد، كافيست متدي با همان نام در كلاس اولاد ايجاد ‎كنيم .درمثال زير اين كار براي كلاسstrawberry روي دومتد‎__construct()‎ , intro()‎ ‎ ‎انجام شده است.

‎‎مثال

<?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();
?> 





--(go to editor for change code and run)

‎‎كلمه كليديPHP-‎final -‎

‎‎با اين كلمه كليدي‎final‎ ميتوان از وراثت ويا فراگيري متدها جلوگيري نمود .

‎‎مثال ـ در اسكريپت زير روش جلوگيري از وراثت كلاس را نشان ميدهد.

<?php 
final class Fruit {
  // some code
}

// will result in error
class Strawberry extends Fruit {
  // some code
}
?> 

--(go to editor for change code and run)

‎‎در اسكريپت زيرازفراگيري متد جلوگيري مي نمايد‎مثال -.

 <?php 
class Fruit {
  final public function intro() {
    // some code
  }
}

class Strawberry extends Fruit {
  // will result in error
  public function intro() {
    // some code
  }
}
?> 

--(go to editor for change code and run)


Previous >    <Next