מתודות ומאפיינים סטטיים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 17 מתוך 91.
בדומה לכך שתכונות יכולות להיות סטטיות, גם מתודות יכולות להשתייך למחלקה עצמה ולא לאובייקטים בודדים. קוראים למתודות סטטיות ישירות דרך המחלקה, ללא צורך ליצור תחילה מופע.
מכריזים על מתודה סטטית באמצעות מילת המפתח static וקוראים לה באמצעות שם המחלקה והאופרטור :::
<?php
class MathHelper {
public static function add($a, $b) {
return $a + $b;
}
public static function multiply($a, $b) {
return $a * $b;
}
}
echo MathHelper::add(5, 3) . "\n";
echo MathHelper::multiply(4, 2);
פלט:
8
8מתודות סטטיות עובדות היטב עם מאפיינים סטטיים. תבנית נפוצה היא שימוש במתודה סטטית לניהול נתוני מחלקה משותפים:
<?php
class Counter {
private static $count = 0;
public static function increment() {
self::$count++;
}
public static function getCount() {
return self::$count;
}
}
Counter::increment();
Counter::increment();
echo Counter::getCount();
פלט:
2שימו לב שמתודות סטטיות אינן יכולות להשתמש ב־$this משום שאין מופע של אובייקט. הן יכולות לגשת רק למאפיינים סטטיים ולמתודות סטטיות אחרות באמצעות self::.
נקודה מרכזית: מתודות סטטיות שימושיות לפונקציות עזר שאינן זקוקות למצב של אובייקט, או לניהול נתונים ברמת המחלקה. הן מספקות פונקציונליות בלי לדרוש יצירה של מופע של אובייקט.
אתגר
קלבואו נבנה מערכת ליצירת מזהים המשתמשת בשיטות ובמאפיינים סטטיים כדי ליצור מזהים ייחודיים בלי צורך ליצור מופעים של אובייקטים.
תיצרו שני קבצים כדי לארגן את הקוד:
IdGenerator.php: הגדירו מחלקה בשםIdGeneratorשמנהלת יצירה של מזהים ייחודיים באמצעות איברים סטטיים בלבד. למחלקה צריך להיות מאפיין סטטי פרטי$lastIdשמתחיל בערך0, ומאפיין סטטי פרטי$prefixשהערך שלו הוא"ID". צרו שיטה סטטית בשםgenerate()שמגדילה את המזהה האחרון ומחזירה מחרוזת בפורמט המשלבת את הקידומת והמזהה החדש (למשל"ID1","ID2"וכן הלאה). הוסיפו שיטה סטטית בשםsetPrefix($newPrefix)שמשנה את הקידומת, ושיטה סטטית בשםgetLastId()שמחזירה את הערך הנוכחי של$lastId.main.php: כללו את קובץ המחלקה IdGenerator. צרו שני מזהים באמצעות הקידומת שמוגדרת כברירת מחדל והדפיסו כל אחד מהם בשורה נפרדת. לאחר מכן, שנו את הקידומת ל-"USER"באמצעות השיטה הסטטית, צרו שני מזהים נוספים והדפיסו כל אחד מהם. לבסוף, הדפיסו את מספר המזהה האחרון באמצעות קריאה לשיטה הסטטית המתאימה.
זכרו שקוראים לשיטות סטטיות ישירות דרך המחלקה באמצעות ClassName::methodName(), ובתוך המחלקה ניגשים למאפיינים סטטיים באמצעות self::$propertyName. מכיוון שאין מופע של אובייקט, אי אפשר להשתמש ב-$this בשיטות סטטיות.
הפלט שלכם אמור להציג את רצף המזהים עם קידומות שונות, ולהדגים כיצד מאפיינים סטטיים שומרים על הערכים שלהם בין קריאות חוזרות לשיטות.
נסו בעצמכם
<?php
// כלול את קובץ המחלקה IdGenerator
require_once 'IdGenerator.php';
// TODO: צור שני מזהים באמצעות הקידומת המוגדרת כברירת מחדל והדפס כל אחד בשורה נפרדת
// TODO: שנה את הקידומת ל-"USER" באמצעות המתודה הסטטית
// TODO: צור שני מזהים נוספים והדפס כל אחד בשורה נפרדת
// TODO: הדפס את המספר של המזהה האחרון באמצעות המתודה הסטטית המתאימה
?>השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין