Skip to content

Singleton pattern for PHP

License

LGPL-3.0, GPL-3.0 licenses found

Licenses found

LGPL-3.0
COPYING.LESSER
GPL-3.0
COPYING
Notifications You must be signed in to change notification settings

petrknap/php-singleton

Repository files navigation

Singleton pattern for PHP

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.