מחוללים ואיטרטורים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 62 מתוך 91.
מחוללים מספקים דרך פשוטה ליצור איטרטורים בלי לממש את הממשק המלא Iterator. פונקציית מחולל משתמשת ב-yield במקום ב-return כדי להפיק ערכים בזה אחר זה, תוך השהיית הביצוע בין ערך לערך.
הנה מחולל בסיסי שמפיק רצף של מספרים:
<?php
function countTo(int $max): Generator {
for ($i = 1; $i <= $max; $i++) {
yield $i;
}
}
foreach (countTo(3) as $number) {
echo "$number\n";
}
פלט:
1
2
3היתרון המרכזי הוא יעילות בזיכרון. במקום ליצור מערך שלם בזיכרון, מחוללים מפיקים ערכים לפי דרישה. זה חיוני כשעובדים עם מערכי נתונים גדולים — מחולל שמעבד מיליון רשומות משתמש באותה כמות זיכרון כמו מחולל שמעבד עשר.
מחוללים יכולים גם להניב זוגות של מפתח וערך:
<?php
function userGenerator(): Generator {
yield 'admin' => 'Alice';
yield 'editor' => 'Bob';
}
foreach (userGenerator() as $role => $name) {
echo "$role: $name\n";
}
פלט:
admin: Alice
editor: Bobכדי להפוך את המחלקות שלך לניתנות לאיטרציה באמצעות foreach, ממשו את הממשק Iterator. עם זאת, ברוב המקרים מחוללים מציעים פתרון נקי יותר עם פחות קוד תשתיתי. הם שימושיים במיוחד בתכנות מונחה עצמים, כאשר מחלקה צריכה לחשוף אוסף של פריטים בלי לטעון הכול לזיכרון בבת אחת.
אתגר
קלבואו נבנה מערכת לניהול מלאי מוצרים שמשתמשת במחוללים כדי לעבור ביעילות על אוספים גדולים בלי לטעון את הכול לזיכרון בבת אחת. תיצרו מחלקה ששומרת מוצרים ומספקת מתודות מחולל למעבר עליהם בדרכים שונות.
תארגנו את הקוד בשלושה קבצים:
Product.php: צרו מחלקהProductשמייצגת פריט במלאי. השתמשו בקידום מאפיינים בבנאי כדי להגדיר$skuציבורי מסוג מחרוזת,$nameציבורי מסוג מחרוזת ו-$priceציבורי מסוג מספר ממשי.Inventory.php: צרו מחלקהInventoryשמנהלת אוסף מוצרים ומספקת מתודות מחולל למעבר עליהם. כללו את קובץ Product. המחלקה צריכה:- להכיל מאפיין מערך פרטי לאחסון המוצרים
- להכיל מתודה
addProduct(Product $product)שמוסיפה מוצר לאוסף - להכיל מתודת מחולל
allProducts(): Generatorשמחזירה כל מוצר באמצעות yield, אחד בכל פעם - להכיל מתודת מחולל
expensiveProducts(float $minPrice): Generatorשמחזירה באמצעות yield רק מוצרים שמחירם גדול מהמחיר המינימלי הנתון או שווה לו, כצמדי מפתח-ערך שבהם המפתח הוא ה-SKU והערך הוא המוצר
main.php: כללו את קובץ Inventory. תקבלו קלט אחד: סף מחיר מינימלי.צרו
Inventoryוהוסיפו את שלושת המוצרים הבאים:- SKU:
"A001", שם:"Laptop", מחיר:999.99 - SKU:
"A002", שם:"Mouse", מחיר:29.99 - SKU:
"A003", שם:"Monitor", מחיר:349.99
תחילה, עברו על
allProducts()והדפיסו את שם המוצר של כל מוצר בשורה נפרדת.לאחר מכן, הדפיסו שורה ריקה, ואז עברו על
expensiveProducts()באמצעות סף הקלט. עבור כל מוצר יקר, הדפיסו"[sku]: [name] - $[price]"בשורה נפרדת. עצבו את המחיר בדיוק עם 2 ספרות אחרי הנקודה העשרונית.- SKU:
האתגר הזה מדגים כיצד מחוללים מאפשרים מעבר עצל על אוספים: כל מוצר מוחזר באמצעות yield רק כשהוא נדרש, וכך הגישה הזו חוסכת בזיכרון במלאי גדול. החזרת צמדי מפתח-ערך ב-expensiveProducts() מדגימה כיצד מחוללים יכולים לספק נתוני מעבר מובנים.
נסו בעצמכם
<?php
require_once 'Inventory.php';
// קרא את הקלט
$minPrice = floatval(trim(fgets(STDIN)));
// TODO: צור מופע של Inventory
// TODO: הוסף שלושה מוצרים:
// SKU: "A001", שם: "Laptop", מחיר: 999.99
// SKU: "A002", שם: "Mouse", מחיר: 29.99
// SKU: "A003", שם: "Monitor", מחיר: 349.99
// TODO: עבור על allProducts() והדפס את שמו של כל מוצר
// TODO: הדפס שורה ריקה
// TODO: עבור על expensiveProducts() באמצעות $minPrice
// עבור כל מוצר יקר, הדפס "[sku]: [name] - $[price]"
// עצב את המחיר עם בדיוק 2 ספרות אחרי הנקודה העשרונית
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים (OOP)
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח $thisמתודותמאפייניםבנאי (__construct)הורס (__destruct)חזרה: מחשבון פשוט4ירושה
ירושה בסיסיתמילת המפתח parent::דריסת מתודותמילת המפתח finalמחלקות מופשטותסיכום – היררכיית עובדים7כימוס
ציבורי, מוגן, פרטימפרטי גישה לעומקמתודות גישה ועדכוןהסתרת מידעקידום פרמטרים בבנאי (8.0)סיכום – מערכת רישומי תלמידים10מושגי OOP מתקדמים
הרכבה לעומת ירושההזרקת תלויותמחלקות אנונימיותטיפוסי Enum (PHP 8.1)סיבים (PHP 8.1)העמקה בשכפול אובייקטיםמחוללים ואיטרטורים2מרחבי שמות וטעינה אוטומטית
מבוא למרחבי שמותמילת המפתח useתקן הטעינה האוטומטית PSR-4הטוען האוטומטי של Composerסיכום – פרויקט מאורגן5ממשקים וחוזים
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםממשק לעומת מחלקה מופשטתרמזי טיפוסים עם ממשקיםסיכום - מחשבון צורות8מתודות קסם
מבוא למתודות קסם__toString ו־__debugInfo__get, __set, __isset, __unset__call ו־__callStatic__clone ושיבוט אובייקטים__serialize ו־__unserializeסיכום – אוסף מותאם אישית3מאפייני מחלקה
מאפייני מופע לעומת מאפיינים סטטייםקבועים במחלקותמתודות ומאפיינים סטטייםמאפיינים פרטיים ומוגניםמאפיינים לקריאה בלבד (PHP 8.1)סיכום – מנהל חשבון בנק6פולימורפיזם
בחינה מחדש של דריסת מתודותפולימורפיזם באמצעות ממשקיםרמזי טיפוסים וטיפוסי איחודקישור סטטי מאוחרסיכום — מעבד תשלומיםתרגלו בעצמכם: קומפיילר PHP אונליין