נגישות       נגישות
שינוי גודל טקסט:
א א א
שינוי צבעי האתר:
? מקשי קיצור:

לחיצה חוזרת ונשנית על המקש Tab תעביר אתכם בין הקישורים והאזורים השונים בעמוד.

הפעלת מקשי הקיצור תלויה בדפדפן שבו אתם משתמשים.

Internet Explorer, Chrome ובגרסאות ישנות של Firefox: לחצו על מקש Alt ועל מקש המספר או האות על-פי הרשימה. ב Firefox 3 ומעלה: לחצו על המקשים Alt + Shift + המספר או האות.

S - עבור לתוכן הדף
L - חיפוש
1- עמוד הבית
2 - פרוייקטים
3 - מדריכים
4 - אודות
5 - צרו קשר
6 - הצהרת נגישות
 

כיצד ומתי להשתמש בדפוס ה-singleton ב-PHP

מחבר:
בתאריך:

משתמשים בדפוס singleton כדי להגביל את מספר האובייקטים שיוצרים מקלאס לאובייקט אחד בלבד.

כדאי לנו להשתמש בדפוס ה-singleton כשאנו רוצים להגביל את הגישה למשאבים יקרים. דוגמת, גישה למסד נתונים, שימוש ב-API חיצוני, או כל משאב יקר אחר שיכול להאט את המערכת או לגרום לעלות כספית. לדוגמה, כל פנייה למסד הנתונים יכולה לעלות בזמן יקר ולהאט את האתר, כל התקשרות עם ספק שירות חיצוני (API) עולה כסף.

 

קלאס סינגלטון::המבנה הכללי

נתחיל בהבנת המאפיינים של קלאס שמציית לדפוס הסינגלטון:

  1. הקונסטרקטור פרטי ומונע יצירה של אובייקט מהקלאס.
  2. בתוך הקונסטרקטור מתבצע התהליך היקר דוגמת התחברות למסד הנתונים.
  3. הדרך היחידה ליצור אובייקט חדש מהקלאס היא באמצעות המתודה getInstance(), שבודקת האם קיים $instance, ורק אם אינו קיים יוצרת את האובייקט מהקלאס.
  4. אם קיים כבר $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 חיצוני.

 

לכל המדריכים PHP מונחה עצמים

 

 

הוסף תגובה חדשה

 

= 7 + 8