petrknap/singleton

Singleton pattern for PHP

Fund package maintenance!
Other

v2.0.1 2024-04-27 11:51 UTC

This package is auto-updated.

Last update: 2024-10-27 12:54:50 UTC


README

Simple implementation of singleton (anti-)pattern.

Why use a singleton?

Because it can solve deadlocks and other problems. See this example:

class UnsafeFileAppender
{
    const MY_FILE = '/tmp/my.file';

    private $handle = null;

    public function __construct()
    {
        $this->handle = fopen(self::MY_FILE, 'a');
        flock($this->handle, LOCK_EX);
    }

    public function __destruct()
    {
        flock($this->handle, LOCK_UN);
        fclose($this->handle);
    }
}

You cannot create two instances at the same time with this code...

$first = new UnsafeFileAppender();  // OK
$second = new UnsafeFileAppender(); // Deadlock

...so simply convert it into singleton...

use PetrKnap\Singleton\SingletonInterface;
use PetrKnap\Singleton\SingletonTrait;

class SafeFileAppender extends UnsafeFileAppender implements SingletonInterface
{
    use SingletonTrait;

    private function __construct()
    {
        parent::__construct();
    }
}

...and use the same instance twice.

$first = SafeFileAppender::getInstance();  // OK
$second = SafeFileAppender::getInstance(); // OK

Run composer require petrknap/singleton to install it. You can support this project via donation. The project is licensed under the terms of the LGPL-3.0-or-later.