מבוא לטרייטים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 או בכל מחלקה אחרת שזקוקה לפונקציונליות של חותמת זמן. כך נפתרת המגבלה של ירושה יחידה, באמצעות שיתוף קוד אופקי לאורך היררכיית המחלקות שלך.
אתגר
קלבואו נבנה מערכת פשוטה לברכות שמדגימה כיצד traits מאפשרים לשתף פונקציונליות בין מחלקות שאינן קשורות זו לזו. תיצרו trait שמספק יכולת לברך, ואז תשתמשו בו בשתי מחלקות שונות לחלוטין.
תארגנו את הקוד בשלושה קבצים:
Greetable.php: צרו trait בשםGreetableשמספק פונקציונליות לברכות. ה-trait צריך לכלול:- מאפיין פרטי
$greeting(מחרוזת) - מתודה
setGreeting(string $greeting)ששומרת את הודעת הברכה - מתודה
greet()שמחזירה את הודעת הברכה
- מאפיין פרטי
Person.php: צרו מחלקהPersonשמשתמשת ב-traitGreetable. כללו את קובץ ה-trait והשתמשו בקידום מאפיינים בבנאי כדי להגדיר מאפיין ציבורי$name. בבנאי, קראו ל-setGreeting()כדי להגדיר את הברכה לערך"Hello, I'm [name]".Robot.php: צרו מחלקהRobotשגם היא משתמשת ב-traitGreetable. כללו את קובץ ה-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 (בשורה חדשה)
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים (OOP)
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח $thisמתודותמאפייניםבנאי (__construct)הורס (__destruct)חזרה: מחשבון פשוט4ירושה
ירושה בסיסיתמילת המפתח parent::דריסת מתודותמילת המפתח finalמחלקות מופשטותסיכום – היררכיית עובדים7כימוס
ציבורי, מוגן, פרטימפרטי גישה לעומקמתודות גישה ועדכוןהסתרת מידעקידום פרמטרים בבנאי (8.0)סיכום – מערכת רישומי תלמידים2מרחבי שמות וטעינה אוטומטית
מבוא למרחבי שמותמילת המפתח useתקן הטעינה האוטומטית PSR-4הטוען האוטומטי של Composerסיכום – פרויקט מאורגן5ממשקים וחוזים
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםממשק לעומת מחלקה מופשטתרמזי טיפוסים עם ממשקיםסיכום - מחשבון צורות8מתודות קסם
מבוא למתודות קסם__toString ו־__debugInfo__get, __set, __isset, __unset__call ו־__callStatic__clone ושיבוט אובייקטים__serialize ו־__unserializeסיכום – אוסף מותאם אישית3מאפייני מחלקה
מאפייני מופע לעומת מאפיינים סטטייםקבועים במחלקותמתודות ומאפיינים סטטייםמאפיינים פרטיים ומוגניםמאפיינים לקריאה בלבד (PHP 8.1)סיכום – מנהל חשבון בנק6פולימורפיזם
בחינה מחדש של דריסת מתודותפולימורפיזם באמצעות ממשקיםרמזי טיפוסים וטיפוסי איחודקישור סטטי מאוחרסיכום — מעבד תשלומיםתרגלו בעצמכם: קומפיילר PHP אונליין