وراثت درoop بدين معني است كه وقتي كلاسي از كلاس ديگر مشتق ميشود، چه مواردي را از آن كلاس مبنا در يافت ميكند .كلاس مبنا را كلاس والد ومشتق شده را فرزند مي ناميم.
كلاس فرزند تمام خصوصيات ومتدهاي عمومي وحفاظت شده
براي يك كلاس وارث از كلمه كليدي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(); ?>
كلاسStrawberry با استفاده از كلاسfurit ايجاد شده است .يعني كلاس فوق وارث كلاس furit ميباشد.
در نتجه كلاسstrawberry ميتواند از ويژگي هاي$name و $colorمطابق اصولpublic استفاده نمايد.متدهاي __construct() , into() را از كلاسfruit بارث ميبرد .
كلاسstrawberry خود داراي متد message() ميباشد.
ويژگي ها ومتد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 ?>
چون تابعintro() بصورت 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? "; // 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 ?>
اين مثال درست كار ميكند، چون قانونprotected رعايت شده است .
در صورتيكه بخواهيم متدي را از والد بارث نرسد، كافيست متدي با همان نام در كلاس اولاد ايجاد كنيم .درمثال زير اين كار براي كلاس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(); ?>
با اين كلمه كليديfinal ميتوان از وراثت ويا فراگيري متدها جلوگيري نمود .
مثال ـ در اسكريپت زير روش جلوگيري از وراثت كلاس را نشان ميدهد.
<?php final class Fruit { // some code } // will result in error class Strawberry extends Fruit { // some code } ?>
در اسكريپت زيرازفراگيري متد جلوگيري مي نمايدمثال -.
<?php class Fruit { final public function intro() { // some code } } class Strawberry extends Fruit { // will result in error public function intro() { // some code } } ?>