account_circle
date_range
Singleton
THIS IS CONSIDERED TO BE AN ANTI-PATTERN! FOR BETTER TESTABILITY AND MAINTAINABILITY USE DEPENDENCY INJECTION!
Purpose#
To have only one instance of this object in the application that will handle all calls.
Examples#
- DB Connector
- Logger (may also be a Multiton if there are many log files for several purposes)
- Lock file for the application (there is only one in the filesystem ...)
UML Diagram#

Code#
Singleton.php#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <?php namespace DesignPatterns\Creational\Singleton; final class Singleton { /** * @var Singleton */ private static $instance; /** * gets the instance via lazy initialization (created on first usage) */ public static function getInstance(): Singleton { if (null === static::$instance) { static::$instance = new static(); } return static::$instance; } /** * is not allowed to call from outside to prevent from creating multiple instances, * to use the singleton, you have to obtain the instance from Singleton::getInstance() instead */ private function __construct() { } /** * prevent the instance from being cloned (which would create a second instance of it) */ private function __clone() { } /** * prevent from being unserialized (which would create a second instance of it) */ private function __wakeup() { } } |
Test#
Tests/SingletonTest.php#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php namespace DesignPatterns\Creational\Singleton\Tests; use DesignPatterns\Creational\Singleton\Singleton; use PHPUnit\Framework\TestCase; class SingletonTest extends TestCase { public function testUniqueness() { $firstCall = Singleton::getInstance(); $secondCall = Singleton::getInstance(); $this->assertInstanceOf(Singleton::class, $firstCall); $this->assertSame($firstCall, $secondCall); } } |