Simple implementation of singleton (anti-)pattern.
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
.