כיצד ומתי להשתמש בדפוס ה-singleton ב-PHP
משתמשים בדפוס singleton כדי להגביל את מספר האובייקטים שיוצרים מקלאס לאובייקט אחד בלבד.
כדאי לנו להשתמש בדפוס ה-singleton כשאנו רוצים להגביל את הגישה למשאבים יקרים. דוגמת, גישה למסד נתונים, שימוש ב-API חיצוני, או כל משאב יקר אחר שיכול להאט את המערכת או לגרום לעלות כספית. לדוגמה, כל פנייה למסד הנתונים יכולה לעלות בזמן יקר ולהאט את האתר, כל התקשרות עם ספק שירות חיצוני (API) עולה כסף.
קלאס סינגלטון::המבנה הכללי
נתחיל בהבנת המאפיינים של קלאס שמציית לדפוס הסינגלטון:
- הקונסטרקטור פרטי ומונע יצירה של אובייקט מהקלאס.
- בתוך הקונסטרקטור מתבצע התהליך היקר דוגמת התחברות למסד הנתונים.
- הדרך היחידה ליצור אובייקט חדש מהקלאס היא באמצעות המתודה getInstance(), שבודקת האם קיים $instance, ורק אם אינו קיים יוצרת את האובייקט מהקלאס.
- אם קיים כבר $instance, המתודה מחזירה את ה-instance הקיים במקום ליצור חדש.
// General singleton class.
class Singleton {
// Hold the class instance.
private static $instance = null;
// The constructor is private to prevent
// initiation with outer code.
private function __construct()
{
// The expensive process (e.g.,db connection) goes here.
}
// The object is created from within the class itself.
// only if the class has no instance.
public static function getInstance()
{
if (self::$instance == null)
self::$instance = new Singleton();
return self::$instance;
}
}
// All the variables point to the same object.
$object1 = Singleton::getInstance();
$object2 = Singleton::getInstance();
$object3 = Singleton::getInstance();
כל המשתנים מצביעים על אותו אובייקט.
קלאס סינגלטון::דוגמה מעשית
נדגים את הדפוס באמצעות קלאס שמגביל את הגישה למסד נתונים.
// Singleton to connect db.
class ConnectDb {
private static $instance = null;
private $conn;
private $host = 'localhost';
private $user = 'db user-name';
private $pass = 'db password';
private $name = 'db name';
// The db connection is established in the private constructor.
private function __construct()
{
$this->conn = new PDO("mysql:host={$this->host};
dbname={$this->name}", $this->user,
$this->pass,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
}
public static function getInstance()
{
if(!self::$instance)
self::$instance = new ConnectDb();
return self::$instance;
}
public function getConnection()
{
return $this->conn;
}
}
וכדי לקבל גישה למסד הנתונים דרך הקלאס:
$instance = ConnectDb::getInstance();
$conn = $instance->getConnection();
דפוס הסינגלטון::טוב, רע או מכוער
דפוס הסינגלטון נחשב לדפוס המושמץ ביותר ואף מוגדר כ-antipattern בגלל שהוא יוצר משתנים גלובליים, ומשתנים גלובליים הם דבר שאנחנו מנסים להפחית כמה שאפשר בגלל שניתן לשנות אותם מכל מקום והם יכולים להימצא בכל מקום (כלומר, אנחנו מתקשים לשלוט בהם ועלולות להיות לכך תוצאות בלתי צפויות).
האם בכל זאת כדאי להשתמש בסינגלטון?
כן, באותם מקרים בודדים שיש לכך הצדקה, וזה כשמנסים להגביל את כמות האינסטנסים ממשאב יקר דוגמת גישה לדטה-בייס או ל-API חיצוני.
אהבתם? לא אהבתם? דרגו!
0 הצבעות, ממוצע 0 מתוך 5 כוכבים
המדריכים באתר עוסקים בנושאי תכנות ופיתוח אישי. הקוד שמוצג משמש להדגמה ולצרכי לימוד. התוכן והקוד המוצגים באתר נבדקו בקפידה ונמצאו תקינים. אבל ייתכן ששימוש במערכות שונות, דוגמת דפדפן או מערכת הפעלה שונה ולאור השינויים הטכנולוגיים התכופים בעולם שבו אנו חיים יגרום לתוצאות שונות מהמצופה. בכל מקרה, אין בעל האתר נושא באחריות לכל שיבוש או שימוש לא אחראי בתכנים הלימודיים באתר.
למרות האמור לעיל, ומתוך רצון טוב, אם נתקלת בקשיים ביישום הקוד באתר מפאת מה שנראה לך כשגיאה או כחוסר עקביות נא להשאיר תגובה עם פירוט הבעיה באזור התגובות בתחתית המדריכים. זה יכול לעזור למשתמשים אחרים שנתקלו באותה בעיה ואם אני רואה שהבעיה עקרונית אני עשוי לערוך התאמה במדריך או להסיר אותו כדי להימנע מהטעיית הציבור.
שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.
המשתמש באתר צריך להיות מודע לכך שאם וכאשר הוא מפתח קוד בשביל פרויקט הוא חייב לשים לב ולהשתמש בסביבת הפיתוח המתאימה ביותר, הבטוחה ביותר, היעילה ביותר וכמובן שהוא צריך לבדוק את הקוד בהיבטים של יעילות ואבטחה. מי אמר שלהיות מפתח זו עבודה קלה ?
השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.