Files
freeCodeCamp/guide/arabic/php/class-inheritance/index.md
2019-06-20 16:59:02 -05:00

7.6 KiB

title, localeTitle
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.

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

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