petrknap/singleton

PHP 的单例模式

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

This package is auto-updated.

Last update: 2024-08-27 12:27:10 UTC


README

单例模式(反)实现的简单示例。

为什么要使用单例?

因为它可以解决死锁和其他问题。参见这个示例

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);
    }
}

使用此代码无法同时创建两个实例...

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

...因此简单地将它转换为单例...

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

class SafeFileAppender extends UnsafeFileAppender implements SingletonInterface
{
    use SingletonTrait;

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

...并使用相同的实例两次。

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

运行 composer require petrknap/singleton 来安装它。您可以通过 捐赠 来支持此项目。该项目根据 LGPL-3.0-or-later 的条款 许可。