petrknap / singleton
PHP 的单例模式
v2.0.1
2024-04-27 11:51 UTC
Requires
- php: >=8.1
- petrknap/shorts: ^2.1
Requires (Dev)
- nunomaduro/phpinsights: ^2.11
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.5
- squizlabs/php_codesniffer: ^3.7
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
的条款 许可。