freeCodeCamp/guide/arabic/php/class-inheritance/index.md

7.7 KiB

title localeTitle
Class Inheritance الوراثة الطبقية

الوراثة الطبقية

إعادة تسمية الكود مع الميراث في البرمجة الموجهة الموجهة

هنا ، سوف نتحدث عن كيف يمكننا إعادة استخدام الكود الذي كتبناه دون الحاجة إلى أي تعليل برمجي باستخدام الميراث.

فئة رجل

هذه هي صفحتنا Man :

`<?php class Man { // 1. Declare the class variables public $name; protected $age; public $height; public $fav_sports; private $fav_drinks;

// 2. Create a constructor method with 3 required parameters: name, age and height 
public function __construct($name, $age, $height) 
{ 
    // 2A. Assign the values of parameters to class properties 
    // Also known as instance variables 
    // Using "$this->property_name" 
    $this->name = $name; 
    $this->age = $age; 
    $this->height = $height; 

    // 2B. Print out the man's attributes and values upon instantiation 
    echo "Our man's name is: " . $this->name . "\n"; 
    echo "He is " . $this->age . " years old and " . $this->height . " tall."; 
} 

// 3. Create class methods 
public function giveFirmHandshakes() 
{ 
    return "I give firm handshakes."; 
} 

public function beStubborn() 
{ 
    return "I am stubborn."; 
} 

public function notPutToiletPaper() 
{ 
    return "It's not humanly possible to remember to put toilet paper rolls when they are finished"; 
} 

// 4. Age getter method 
public function getAge() 
{ 
    return $this->age; 
} 

// Age setter method 
public function setAge($age) 
{ 
    $this->age = $age; 
} 

// 5. Favorite Drinks setter method 
public function setFavDrinks($drinks = array()) 
{ 
    if ($drinks) { 
        $this->fav_drinks = $drinks; 
    } 
} 

// Favorite Drinks getter method 
public function getFavDrinks() 
{ 
    return $this->fav_drinks; 
} 

} `

رجل صحي

لنفترض أننا نريد إنشاء فئة أخرى تسمى HealthyMan والتي تحتوي على كل خصائص وأساليب فئة Man .

بدون الاضطرار إلى إعادة كتابة جميع الرموز الخاصة بفئة Man ، يمكننا إعادة استخدام هذا الرمز باستخدام الكلمة الأساسية الممتدة.

`<?php class HealthyMan extends Man {

} `

الآن لدينا جميع خصائص وأساليب الفصل من رجل داخل HealthyMan . يمكننا HealthyMan فئة HealthyMan للتحقق من هذا سريع حقيقي.

<?php $jackie = new HealthyMan('Jackie', 25, '5\' 5"'); // => Our man's name is: Jackie // => He is 25 years old and 5' 5" tall.

يمكننا المضي قدمًا ووضع رياضة ومشروبات HealthyMan aka aka المفضلة.

`<?php $jackie->fav_sports = ['swimming', 'weight training']; print_r($jackie->fav_sports); // => // Array // ( // [0] => swimming // [1] => weight training // )

$jackie->setFavDrinks(['Matcha tea', 'Oolong Tea']); print_r($jackie->getFavDrinks()); // => // Array // ( // [0] => Matcha tea // [1] => Oolong Tea // ) `

الآن دعنا نرى ما إذا كان باستطاعتنا الاتصال بطرق giveFirmHandshakes() الرجل مثل giveFirmHandshakes() و beStubborn() و notPutToiletPaper() .

`<?php echo "\n" . $jackie->giveFirmHandshakes(); // => I give firm handshakes.

echo "\n" . $jackie->beStubborn(); // => I am stubborn.

echo "\n" . $jackie->notPutToiletPaper(); // => It's not humanly possible to remember to put toilet paper rolls when they are finished `

نحصل على كل هذه الأشياء من خلال مجرد ترميز فئة رجل باستخدام الكلمة الأساسية الممتدة.

رجل صحي حقيقي

إذا كنا نرث HealthyMan من فئة Man ولا نفعل شيئًا بها ، فعندئذٍ يتفوق على الهدف كله.

يحتوي تصنيف HealthyMan على خصائص إضافية مثل body_fat_percentage و workout_per_week ، وأساليب مثل eatHealthy() و meditateDaily() و laughOften() .

بما أن هذه خصائص شخصية ، فيمكننا إما أن نضع عليها رؤية محمية أو خاصة وأن ننشئ طرق تعيين / تراكب للتغليف الكامل.

`<?php class HealthyMan extends Man { /** * HealthyMan properties */ private $body_fat_percentage; private $workout_per_week;

/** 
 * HealthyMan methods 
 */ 
public function eatHealthy() 
{ 
    return "I only eat healthy meals."; 
} 

public function meditateDaily() 
{ 
    return "I set aside 20 minutes daily to meditate."; 
} 

public function laughOften() 
{ 
    return "I watch funny TV shows to unwind myself."; 
} 

/** 
 * HealthyMan Setters and Getters 
 */ 
public function setBodyFatPercentage($fat_percentage) 
{ 
    $this->body_fat_percentage  = $fat_percentage; 
} 

public function getBodyFatPercentage() 
{ 
    return $this->body_fat_percentage; 
} 

public function setWorkoutPerWeek($workout_times) 
{ 
    $this->workout_per_week = $workout_times; 
} 

public function getWorkoutPerWeek() 
{ 
    return $this->workout_per_week; 
} 

} `

يمكننا استدعاء هذه الطرق لمعرفة ما إذا كانت تعمل كما هو متوقع:

`<?php

echo "\n" . $jackie->eatHealthy(); // => I only eat healthy meals.

echo "\n" . $jackie->meditateDaily(); // => I set aside 20 minutes daily to meditate.

echo "\n" . $jackie->laughOften(); // => I watch funny TV shows to unwind myself.

$jackie->setBodyFatPercentage(12); echo "\nBody Fat %: " . $jackie->getBodyFatPercentage(); // => Body Fat %: 12

$jackie->setWorkoutPerWeek(5); echo "\nWorkout Times Per Week: " . $jackie->getWorkoutPerWeek(); // => Workout Times Per Week: 5 `

لقد نجحنا في إعادة استخدام الشفرة الحالية ونفذنا برنامجًا دراسيًا للأطفال.

هل هو ذلك العنيد؟

على الرغم من أنه ورث عن beStubborn() من فئة Man ، حيث أن Jackie رجل سليم ، فهو عنيد فقط مرة واحدة فقط في فترة. يمكننا أن نحصل على beStubborn() " beStubborn() Healthy Man's beStubborn() " ليقول "أنا عنيد من حين beStubborn() " بدلاً من "أنا عنيد" فقط عن طريق تجاوز أسلوب "الطبقة الأم".

`<?php class HealthyMan extends Man { ..... .....

public function beStubborn() 
{ 
    return "I am stubborn once in a while."; 
} 

..... 
..... 

} `

الآن عندما نتمكن من beStubborn() طريقة beStubborn() ، سنرى مخرجًا مختلفًا عن ذي قبل:

<?php echo "\n" . $jackie->beStubborn(); // => I am stubborn once in a while.

يوضح هذا كيف يعمل overriding الأسلوب في OOP.

باستخدام تجاوز الأسلوب ، نقوم بشكل أساسي بإعادة تعريف طريقة "الفئة الأصل" داخل الفئة الفرعية.

بهذه الطريقة ، يحتفظ أي مثيل لفئة الأبوين بطريقته الأصلية في حين أن أي مثيل للفئة الفرعية له الطريقة المعدلة أو التي تم تجاوزها.