可变单例才是王道 先上代码
<?php
trait DNSingleton
{
protected static $_instances=[];
public static function G($object=null)
{
if(defined('DNMVCS_DNSINGLETON_REPALACER')){
$callback=DNMVCS_DNSINGLETON_REPALACER;
return ($callback)(static::class,$object);
}
if($object){
self::$_instances[static::class]=$object;
return $object;
}
$me=self::$_instances[static::class]??null;
if(null===$me){
$me=new static();
self::$_instances[static::class]=$me;
}
return $me;
}
}
class BaseClass
{
use DNSingleton;
public function foo(){ echo "新年快乐\n"; }
}
class MyClass extends BaseClass
{
public function foo(){ echo "猪年快乐\n"; }
}
BaseClass::G()->foo();
BaseClass::G(MyClass::G());
BaseClass::G()->foo();
输出:
新年快乐
猪年快乐
都是调用 BaseClass::G()->foo(); ,前一个输出 新年快乐 ,后一个输出 猪年快乐
不用配置什么东西,只要在调用前替换就行
这个 G 函数是从 https://github.com/dvaknheo/DNMVCS 这个框架提出来的。并克隆用于。
https://github.com/dvaknheo/SwooleHttpd
这个 swoole 项目。在 SwooleHttpd 项目中,替换 DNMVCS_DNSINGLETON_REPALACER ,实现了 协程单例
对这个 G 函数有什么要问的? 鼓励我一下.
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.