Design Patterns: PHP Singleton

Design Patterns: PHP Singleton

บทความนี้เรามาดูตัวอย่างการใช้ Design Patterns มาใช้ในภาษา PHP โดยตัวอย่างนี้จะเป็นเรื่องของ Singleton

ในการออกแบบ web application นั้น ก็มักจะมีแนวทางในการออกแบบที่หลากหลายรูปแบบกันไป และมักจะมีการออกแบบให้มีการเข้าถึง instance ใน Class ไม่น้อยเช่นกัน เช่น เราต้องการจะเข้าถึง Object ที่เกี่ยวกับการติดต่อฐานข้อมูลหนึ่ง ๆ เราไม่จำเป็นจะต้องสร้าง Object ชนิดนี้ออกมามากมาย เพียงแค่ Object เดียวแล้วเวลาจะใช้ก็ทำการเรียก getInstance เอา Object นั้นออกมาใช้งานเพียงแค่นี้ก็พอแล้ว และก็มีอีกอย่างนั่นก็คือเราไม่จำเป็นต้องแก้ไขหรือไม่ให้ใครมาแก้ไข Object นี้ เราจะออกแบบยังไง The singleton pattern สามารถช่วยคุณได้ มาดูตัวอย่างง่าย ๆ กัน

<?php
class Singleton
{
/**
* @var Singleton The reference to *Singleton* instance of this class
*/
private static $instance;

/**
* Returns the *Singleton* instance of this class.
*
* @return Singleton The *Singleton* instance.
*/
public static function getInstance()
{
if (null === static::$instance) {
static::$instance = new static();
}

return static::$instance;
}

/**
* Protected constructor to prevent creating a new instance of the
* *Singleton* via the `new` operator from outside of this class.
*/
protected function __construct()
{
}

/**
* Private clone method to prevent cloning of the instance of the
* *Singleton* instance.
*
* @return void
*/
private function __clone()
{
}

/**
* Private unserialize method to prevent unserializing of the *Singleton*
* instance.
*
* @return void
*/
private function __wakeup()
{
}
}

class SingletonChild extends Singleton
{
}
?>

จากโค้ดจะเห็นว่าตัวแปรที่ต้องการจะ return นั้นจะต้องเป็น static เวลาจะใช้งานเราก็เรียก getInstance() เช่น Singleton::getInstance(); ในฟังก์ชันเราก็ทำการเช็คตัวแปรก่อนว่ามีค่าแล้วหรือเปล่า หรือมีคนเรียกแล้วหรือยัง ถ้ายังเราก็ทำการสร้างขึ้นมาแล้วเก็บไว้ในตัวแปรประจำ Class จากนั้นเมื่อทำการเรียกครั้งต่อไป เราจะทำการ return ตัวแปรเดิมที่เคยเรียกไปแล้ว

ดูเพิ่มเติมได้ที่
http://www.phptherightway.com/pages/Design-Patterns.html
https://en.wikipedia.org/wiki/Singleton_pattern

Add a Comment