1.8. Singleton
THIS IS CONSIDERED TO BE AN ANTI-PATTERN! FOR BETTER TESTABILITY ANDMAINTAINABILITY USE DEPENDENCY INJECTION!
1.8.1. Purpose
To have only one instance of this object in the application that willhandle all calls.
1.8.2. Examples
- DB Connector
- Logger (may also be a Multiton if there are many log files forseveral purposes)
- Lock file for the application (there is only one in the filesystem…)
1.8.3. UML Diagram
1.8.4. Code
You can also find this code on GitHub
Singleton.php
- <?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()
- {
- }
- }
1.8.5. Test
Tests/SingletonTest.php
- <?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);
- }
- }