ירושה ב-PHP OOP

גישה לשינויים ב-PHP
קבועים ב-PHP OOP

מהי ירושה?

כאשר מחלקה נובעת ממחלקה אחרת, היא ידועה בשם ירושה. הנה כמה מונחים חשובים הקשורים להורשה ב-PHP.

  • כיתת הורים – המחלקה שממנה נגזרות המחלקות האחרות נקראת מחלקה אב. זה ידוע גם כמעמד בסיס.
  • כיתת ילדים – הכיתה שמקורה בכיתה אחרת נקראת כיתת ילד. יש לזה כמה שמות אחרים כמו כיתה עלים או כיתה נגזרת.
ירושה ב-PHP

איך יורשים מחלקה ב-PHP?

מחלקה יכולה לעבור בירושה על ידי שימוש ב- משתרע מילת מפתח. תסתכל על הדוגמה הבאה.

<?php
class Fruit {
    protected $name;
    protected $color;

    public function __construct($name, $color) {
        $this->name = $name;
        $this->color = $color;
    }

    public function getName() {
        return $this->name;
    }

    public function getColor() {
        return $this->color;
    }
}

class Apple extends Fruit {
    protected $variety;

    public function __construct($name, $color, $variety) {
        parent::__construct($name, $color);
        $this->variety = $variety;
    }

    public function getVariety() {
        return $this->variety;
    }
}

$apple = new Apple('Apple', 'Red', 'Fuji');
echo $apple->getName(); // Output: Apple
echo $apple->getColor(); // Output: Red
echo $apple->getVariety(); // Output: Fuji
?>

בדוגמה זו, הכיתה אפל משתרע המחלקה Fruit, כלומר המחלקה Apple מכילה את כל התכונות והשיטות של המחלקה Fruit בנוסף לשלה. בנאי המחלקה של Apple משתמש בפונקציה parent:: construct() כדי לקרוא לבנאי האב, ומספק את הפרמטרים המתאימים. לאחר מכן, באמצעות ירושה, תוכל ליצור מופע של מחלקת Apple ולגשת לפונקציה ממחלקת האב.

לסיכום האמור לעיל:

  1. ירושה מאפשרת למחלקת הילד לגשת למבנה הציבורי, לשיטות ולמאפיינים של מחלקת האב.
  2. בדוגמה שלמעלה, נוכל לגשת לשיטה של ​​Apple class באמצעות האובייקט שלה, כמו גם לשיטות של מחלקה אב.

היקף משנה גישה מוגנת בירושה

במדריך הקודם למדנו שתכונות/שיטות מוגנות של כיתה נגישות בתוך הכיתה והשיעורים הנגזרים ממנה.

כדי להבין את ההיקף של משנה גישה מוגנת בירושה, הבה נסתכל על הדוגמה הבאה.

<?php
class Fruit {
  public $name;
  public $color;
  public function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  protected function intro() {
    echo "I am $this->name and my color is $this->color";
  }
}

class Apple extends Fruit {
  public function message() {
    echo "I am from Fruit class or Apple one?";
  }
}

$apple = new Apple("Apple", "red");
$apple->message();
$apple->intro();
?>

בדוגמה למעלה:

  • אנחנו עושים מחלקה שנקראת פירות שיש לה מאפיינים ציבוריים מסוימים ופונקציה מוגנת.
  • אנחנו בונים מחלקה נוספת, apple, שנמשכת מ-Fruit ויש לה מופע משלה.
  • כאשר אנו מנסים לגשת למתודה המוגנת של המחלקה Fruit באמצעות אובייקט מחלקה apple, זה נותן שגיאה מכיוון שאנו מנסים לגשת לחבר מוגן במחלקה Fruit מחוץ למחלקה הנגזרת.

בואו נסתכל על דוגמה נוספת, שהיא בעצם גרסה מעט שונה של הגרסה האחרונה.

<?php
class Fruit {
  public $name;
  public $color;
  public function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  protected function intro() {
    echo "I am {$this->name} and my color is {$this->color}.";
  }
}

class Apple extends Fruit {
  public function message() {
    echo "Am I a fruit or an apple? ";
    $this -> intro(); // protected
  }
}

$apple = new Apple("Apple", "red");
$strawberry->message();
?>

מכיוון שאנו ניגשים אליו בתוך המחלקה בדוגמה הקודמת, השיטה המוגנת של המחלקה Fruit זמינה במחלקה apple.

עוקף בירושה

דריסה פירושה הגדרה מחדש של השיטות של כיתת האב בכיתות הילד עם אותו שם. שקול את הדוגמה הבאה עוקפת הירושה.

<?php
class Fruit {
  public $name;
  public $color;
  public function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  public function intro() {
    echo "I am {$this->name} and my color is {$this->color}.";
  }
}

class Apple extends Fruit {
  public $weight;
  public function __construct($name, $color, $weight) {
    $this->name = $name;
    $this->color = $color;
    $this->weight = $weight;
  }
  public function intro() {
    echo "I am {$this->name}, my color is {$this->color}. Also, my weight is {$this->weight} kg.";
  }
}

$apple= new Apple("Apple", "red", 50);
$apple->intro();
?>

בדוגמה למעלה:

  • דריסה פירושה שינוי שמות השיטות של כיתת האב בכיתות הילד. שקול את הדוגמה הבאה של דריסה בירושה.
  • ראוי לציין שלשיטות __construct ו-intro בתפוח הכיתה הילד יש את אותו השם. עם זאת, הפרמטרים עשויים להשתנות.
  • אנו יוצרים מופע של המחלקה Apple ושולחים את הארגומנטים לשיטת ה-build.
  • מכיוון שיצרנו את מופע האובייקט של apple באמצעות בנאי מחלקות ה-apple, כאשר אנו קוראים לשיטת ה-intro באמצעות מופע של apple, הוא קורא לפונקציית ה-intro של מחלקת ה-apple.

תפקיד מילת המפתח הסופית בירושה

מילת המפתח הסופית אוסרת על הילד/הכיתה הנגזרת לעקוף את פונקציית ההורה/כיתה הבסיסית. עיין בדוגמה הבאה כדי לראות כיצד משתמשים במילת המפתח הסופית.

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

class Apple extends Fruit {
// error to override the intro
  public function intro() {
    // code
  }
}
?>

המחלקה Apple מנסה לעקוף את שיטת המבוא בדוגמה הקודמת. זה יזרוק שגיאה מכיוון שהשתמשנו במילת המפתח הסופית עם פונקציית המבוא של מחלקה Fruit.

אם אתה רוצה לקרוא עוד על תורשת PHP אז אנו ממליצים על הדברים הבאים מדריך רשמי.

שאלות ותשובות

ש: ב-PHP OOP, מהי ירושה?
ת: ב-PHP OOP, inheritance היא מערכת המאפשרת למחלקה חדשה לרשת את התכונות והשיטות של מחלקה קודמת. זה מרמז שהמחלקה החדשה יכולה לעשות שימוש חוזר בקוד ובפונקציונליות של מחלקת האב תוך הוספת מאפיינים ושיטות חדשות משלה.

ש: ב-PHP, איך מגדירים מחלקה שיורשת ממחלקה אחרת?
ת: ב-PHP, מילת המפתח "extends" משמשת להגדרת מחלקה שיורשת ממחלקה אחרת. לדוגמה, אם יש לך כיתת הורה "ChildClass" ואתה רוצה לבנות כיתת ילד "ChildClass" שיורשת ממנה, תוכל לכתוב:

class ChildClass extends ParentClass {
  // properties and methods
}

ש: ב-PHP, האם מחלקה יכולה לרשת משיעורים רבים?
ת: לא, ב-PHP, מחלקה יכולה לרשת רק ממחלקה אחת אחרת. עם זאת, ניתן להשתמש בממשקים כדי לספק פונקציונליות מקבילה, ומחלקה יכולה ליישם ממשקים רבים.

ש: האם ניתן לעקוף שיטה בכיתת ילד?
ת: כן, אתה יכול לעקוף שיטה בכיתת צאצא על ידי יצירת שיטה עם אותו שם. כאשר מופעל על אובייקט מחלקה צאצא, שיטת מחלקת הילד תשמש במקום שיטת מחלקת האב.

ש: האם ניתן להפעיל שיטת כיתת אב מכיתת ילד?
ת: כן, אתה יכול להשתמש במילת המפתח "הורה" ואחריה באופרטור רזולוציית ההיקף (::) ובשם השיטה כדי לקרוא לשיטת מחלקה אב ממחלקת ילד. לדוגמא:

class ChildClass extends ParentClass {
  public function childMethod() {
    parent::parentMethod();
  }
}

תרגילים:

  1. מהי מילת המפתח המשמשת ב-PHP כדי לציין שמחלקה יורשת ממחלקה אחרת?
  2. כיצד ניתן לגשת למתודה או למאפיין מכיתת האב בכיתת ילד?
  3. איך אפשר לקרוא לבנאי של כיתת האב בתוך הבנאי של כיתת ילד?
  4. כיצד ניתן למנוע ביטול של שיטה או נכס בכיתת ילד?
  5. מה ההבדל בין extends ו implements מילות מפתח ב-PHP?

תשובות:

  1. אל האני extends מילת מפתח משמשת ב-PHP כדי לציין שמחלקה יורשת ממחלקה אחרת.
  2. אתה יכול לגשת למתודה או למאפיין מכיתת האב בכיתת צאצא על ידי שימוש ב- parent:: מילת מפתח, ואחריה שם השיטה או המאפיין.
  3. אתה יכול לקרוא לבנאי של כיתת האב בתוך הבנאי של כיתת ילד על ידי שימוש ב- parent::__construct() שִׁיטָה.
  4. אתה יכול למנוע ביטול של שיטה או מאפיין בכיתת ילד על ידי שימוש ב- final מילת מפתח לפני הצהרת השיטה או המאפיין במחלקת האב.
  5. אל האני extends מילת המפתח משמשת לציון שמחלקה יורשת ממחלקה אחרת, בעוד ש- implements מילת מפתח משמשת כדי לציין שכיתה מיישמת ממשק.
גישה לשינויים ב-PHP
קבועים ב-PHP OOP
close

הישאר מעודכן לגבי PHP!

אנחנו לא שולחים ספאם!

en English
X
גלול למעלה