Menu
Coddy logo textTech

מבוא לטרייטים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 51 מתוך 91.

PHP תומכת רק בירושה יחידה — מחלקה יכולה לרשת רק מחלקת אב אחת. אבל מה אם צריך לשתף פונקציונליות בין כמה מחלקות שאינן קשורות זו לזו? כאן נכנסות לתמונה תכונות.

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

<?php
trait Timestampable {
    private string $createdAt;
    
    public function setCreatedAt(): void {
        $this->createdAt = date('Y-m-d H:i:s');
    }
    
    public function getCreatedAt(): string {
        return $this->createdAt;
    }
}

class Article {
    use Timestampable;
    
    public function __construct(public string $title) {
        $this->setCreatedAt();
    }
}

$article = new Article("PHP Traits");
echo $article->getCreatedAt();

מילת המפתח use בתוך מחלקה מייבאת את איברי ה-trait. כעת ל-Article יש גישה אל setCreatedAt() ואל getCreatedAt() כאילו הוגדרו ישירות במחלקה.

אפשר להשתמש באותה התכונה במחלקות שונות לחלוטין — במחלקה Comment, במחלקה User או בכל מחלקה אחרת שזקוקה לפונקציונליות של חותמת זמן. כך נפתרת המגבלה של ירושה יחידה, באמצעות שיתוף קוד אופקי לאורך היררכיית המחלקות שלך.

challenge icon

אתגר

קל

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

תארגנו את הקוד בשלושה קבצים:

  • Greetable.php: צרו trait בשם Greetable שמספק פונקציונליות לברכות. ה-trait צריך לכלול:
    • מאפיין פרטי $greeting (מחרוזת)
    • מתודה setGreeting(string $greeting) ששומרת את הודעת הברכה
    • מתודה greet() שמחזירה את הודעת הברכה
  • Person.php: צרו מחלקה Person שמשתמשת ב-trait Greetable. כללו את קובץ ה-trait והשתמשו בקידום מאפיינים בבנאי כדי להגדיר מאפיין ציבורי $name. בבנאי, קראו ל-setGreeting() כדי להגדיר את הברכה לערך "Hello, I'm [name]".
  • Robot.php: צרו מחלקה Robot שגם היא משתמשת ב-trait Greetable. כללו את קובץ ה-trait והשתמשו בקידום מאפיינים בבנאי כדי להגדיר מאפיין ציבורי $model. בבנאי, קראו ל-setGreeting() כדי להגדיר את הברכה לערך "Beep boop, I am model [model]".

ב-main.php, כללו את שני קובצי המחלקות. תקבלו שתי קלטים: שם של אדם ומספר הדגם של רובוט. צרו מופעים של שתי המחלקות והדפיסו את הברכות שלהן בשורות נפרדות.

כך מודגם כוחם של traits: Person ו-Robot הן מחלקות שאינן קשורות זו לזו כלל, ואין להן מחלקת אב משותפת, ובכל זאת שתיהן מקבלות את אותה פונקציונליות לברכות באמצעות ה-trait. כל מחלקה מתאימה אישית את אופן השימוש שלה בפונקציונליות הזו.

נסו בעצמכם

<?php

require_once 'Person.php';
require_once 'Robot.php';

// קרא את הקלט
$name = trim(fgets(STDIN));
$model = trim(fgets(STDIN));

// TODO: צור מופע של Person עם השם הנתון
// TODO: צור מופע של Robot עם הדגם הנתון
// TODO: הדפס את הברכה של Person
// TODO: הדפס את הברכה של Robot (בשורה חדשה)

?>
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר PHP אונליין