یکی از دستوراتی که در بحث ارث بری مورد استفاده قرار می گیرد دستور final است که هم در کلاس ها و هم در متدها مورد استفاده قرار می گیرد.
کلاس هایی که بصورت final تعریف میشود این امکان که در کلاس فرزند به ارث برده شود وجود ندارد همچنین متد final نیز نمی توان در کلاس فرزند بازنویسی کرد و با خطای fatal error مواجه می شویم.
این به این معنی نیست که کلاس final قابلیت ساخت آبجکت را ندارد.پس می توان از روی آنها شی جدید ایجاد کرد.
در اصل متدها و کلاس هایی که بصورت final تعریف می شوند تنها تعریف شده اند و بدرد ارث بری نمی خورند و فقط می توان در حالت ساخت شی از آنها استفاده کرد.
خلاصه مفهوم final:
- تنها بر روی کلاس ها و متدها مورد استفاده قرار می گیرد و خصوصیات قابل استفاده از این دستور نیستند.
- می توان از روی کلاس final شی ساخت و به متد final دسترسی پیدا کرد.
- کلاس یا متد final قابل ارث بردن و بازنویسی نیستند.
نحوه تعریف کلاس بصورت final
1 |
final class className{} |
نحوه تعریف متد بصورت final
1 2 3 |
class className{ final public function methodName(){} } |
نمونه کلاس final که به ارث برده شده است
1 2 3 4 5 6 7 8 9 10 11 |
<?php final class Car{ public $name = "amir"; public $family = "javanmir"; } class Pride extends Car{ } ?> //Fatal error: Class Pride may not inherit from final class (Car) in E:\xampp5\htdocs\mvc\Car.php on line 9 |
نمونه بازنویسی متدی که final است
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php class Car{ protected $name = "amir"; protected $family = "javanmir"; final public function fullName(){ return $this->name. " " .$this->family; } } class Pride extends Car{ public function fullName(){ return $this->name. " " .$this->family; } } $car = new Pride(); echo $car->fullName(); ?> //Fatal error: Cannot override final method Car::fullName() in E:\xampp5\htdocs\mvc\Car.php on line 15 |
نمونه ساخت شی از روی کلاسی که دارای متد final است
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php class Car{ protected $name = "amir"; protected $family = "javanmir"; final public function fullName(){ return $this->name. " " .$this->family; } } class Pride extends Car{ } $car = new Pride(); echo $car->fullName(); ?> //amir javanmir |