paulund

Singleton Design Pattern

Singleton Design Pattern

The Singleton pattern ensures that a class has only one instance and provides global access to that instance.

A common use case is a database connection. Your application does not need to open multiple connections to the database; a single connection is sufficient, and all queries run through it. The Singleton pattern gives you that single connection, reusable from anywhere in the code, without accidentally creating a new one.

Be aware that the Singleton can lead to poor design if overused. It also makes code harder to test unless you reset the instance between tests.

Example

<?php

namespace DesignPatterns\Singleton;

/**
 * The Singleton class exposes a `getInstance` method that either creates
 * the instance on first call or returns the existing one.
 */
class Singleton
{
    /**
     * The Singleton's instance is stored in a static field.
     */
    private static $instance = null;

    /**
     * The constructor is private so that external code cannot create new instances directly.
     */
    protected function __construct() { }

    /**
     * Singletons should not be cloneable.
     */
    protected function __clone() { }

    /**
     * Returns the single instance. Creates it on first call; returns the
     * existing instance on every subsequent call.
     */
    public static function getInstance(): Singleton
    {
        if (self::$instance === null) {
            self::$instance = new static();
        }

        return self::$instance;
    }

    /**
     * Business logic methods
     */
    public function methods()
    {
    }
}

/**
 * Usage: verify that getInstance always returns the same object.
 */
function someCode()
{
    $singleton1 = Singleton::getInstance();
    $singleton2 = Singleton::getInstance();

    if ($singleton1 === $singleton2) {
        echo 'Singleton getInstance returned the same object';
    } else {
        echo 'Singleton getInstance did not return the same object';
    }
}

someCode();