שימוש במספר טרייטים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 52 מתוך 91.
תכונה יחידה שימושית, אבל העוצמה האמיתית מתגלה כשמשלבים כמה תכונות במחלקה אחת. PHP מאפשרת לך לכלול כמה תכונות שצריך, וכך להעניק למחלקה שלך יכולות מכמה מקורות בבת אחת.
כדי להשתמש בכמה traits, פשוט רשמו אותם מופרדים בפסיקים אחרי מילת המפתח use:
<?php
trait Timestampable {
public function getTimestamp(): string {
return date('Y-m-d H:i:s');
}
}
trait Identifiable {
private string $id;
public function generateId(): void {
$this->id = uniqid('id_');
}
public function getId(): string {
return $this->id;
}
}
class Post {
use Timestampable, Identifiable;
public function __construct(public string $title) {
$this->generateId();
}
}
$post = new Post("Hello World");
echo $post->getId() . " - " . $post->getTimestamp();
פלט:
id_6789abc123 - 2024-01-15 10:30:00למחלקה Post יש עכשיו מתודות משתי התכונות. כל תכונה תורמת את הפונקציונליות שלה - Timestampable מספקת מתודות הקשורות לזמן, בעוד Identifiable מטפלת במזהים ייחודיים. הגישה הזאת משאירה כל תכונה ממוקדת באחריות אחת, והופכת את הקוד שלך למודולרי יותר וניתן לשימוש חוזר.
מה קורה כשלשתי תכונות יש מתודות באותו שם? זהו מצב של התנגשות שנחקור בשיעור הבא.
אתגר
קלבואו נבנה מערכת לניהול מוצרים שמשלבת כמה traits כדי להעניק למוצרים יכולות תמחור וניהול מלאי. כל trait יטפל באחריות אחת, והמחלקה של המוצר שלך תקבל פונקציונליות משניהם.
תארגן את הקוד שלך בשלושה קבצים:
Priceable.php: צור trait בשםPriceableשמטפל בפונקציונליות התמחור. ל-trait צריכים להיות:- מאפיין פרטי
$price(מספר ממשי) - מתודה
setPrice(float $price)ששומרת את המחיר - מתודה
getPrice()שמחזירה את המחיר - מתודה
getFormattedPrice()שמחזירה את המחיר בפורמט"$[price]"עם 2 ספרות אחרי הנקודה העשרונית
- מאפיין פרטי
Stockable.php: צור trait בשםStockableשמנהל את המלאי. ל-trait צריכים להיות:- מאפיין פרטי
$stock(מספר שלם) - מתודה
setStock(int $quantity)ששומרת את כמות המלאי - מתודה
getStock()שמחזירה את המלאי הנוכחי - מתודה
isInStock()שמחזירהtrueאם המלאי גדול מ-0, ו-falseאחרת
- מאפיין פרטי
main.php: כלול את שני קובצי ה-trait וצור מחלקה בשםProductשמשתמשת בשני ה-traits,Priceableו-Stockable. השתמש בקידום מאפיינים בבנאי כדי להגדיר מאפיין ציבורי$name. הבנאי צריך לקבל גם מחיר וכמות מלאי, ולהשתמש במתודות של ה-traits כדי להגדיר אותם.תקבל שלוש קלטים: שם מוצר, מחיר וכמות מלאי. צור מוצר עם הערכים האלה והדפס ארבע שורות:
- שם המוצר
- המחיר בפורמט המתאים (באמצעות
getFormattedPrice()) - כמות המלאי
"Available"אם המוצר במלאי, או"Out of stock"אם לא
כך אפשר לראות איך כמה traits פועלים יחד. מחלקת Product מקבלת יכולות תמחור מ-trait אחד וניהול מלאי מאחר, וכך כל תחום אחריות נשאר מופרד היטב, ובו בזמן הם משתלבים יחד למוצר בעל יכולות מלאות.
נסו בעצמכם
<?php
require_once 'Priceable.php';
require_once 'Stockable.php';
// TODO: צרו מחלקה Product שמשתמשת גם ב-trait Priceable וגם ב-trait Stockable
// השתמשו בקידום פרמטרים בבנאי עבור המאפיין הציבורי $name
// הבנאי צריך לקבל שם, מחיר וכמות במלאי, ולהשתמש במתודות של ה-traits כדי להגדיר את המחיר ואת הכמות במלאי
class Product {
// TODO: השתמשו כאן ב-traits
// TODO: מימשו בנאי עם קידום פרמטרים עבור $name
// והגדירו את המחיר ואת הכמות במלאי באמצעות מתודות של ה-traits
}
// קראו קלט
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$stock = intval(trim(fgets(STDIN)));
// TODO: צרו מופע של Product עם ערכי הקלט
// TODO: הדפיסו את שם המוצר
// TODO: הדפיסו את המחיר המעוצב באמצעות getFormattedPrice()
// TODO: הדפיסו את הכמות במלאי
// TODO: הדפיסו "Available" אם המוצר במלאי, או "Out of stock" אם לא
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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פולימורפיזם
בחינה מחדש של דריסת מתודותפולימורפיזם באמצעות ממשקיםרמזי טיפוסים וטיפוסי איחודקישור סטטי מאוחרסיכום — מעבד תשלומים9טרייטים
מבוא לטרייטיםשימוש במספר טרייטיםפתרון התנגשויות בין טרייטיםמתודות מופשטות בטרייטיםטרייטים לעומת ירושהתרגלו בעצמכם: קומפיילר PHP אונליין