PHP的static关键字实现单例模式和享元模式
2023-09-27 14:25:41 时间
码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071
发现
最近看公司底层源码,发现有很多方法里边用到了static变量,用于实现享元模式,之前没接触到过,今天特意研究一下。
提问
首先抛出一个问题,下面这段代码会输出什么?
<?php
function test($key = '', $value = '')
{
static $data = array();
if (!empty($key)) {
$data[$key] = $value;
}
return $data;
}
print_r( test(1, 111) );
print_r( test(2, 222) );
如果你的回答是下面,那么说明你对static没有真正理解
Array
(
[2] => 222
)
探究
static在函数内使用,第一次调用时static变量不存在,所以会定义,第二次开始, static $data = array();这条语句并不会重新定义了,所以输出应该如下:
Array
(
[1] => 111
)
Array
(
[1] => 111
[2] => 222
)
应用
我们平时实现单例模式是不是都是用面向对象的,三私一公?现在我们明白了static,用static实现单例,比面向对象的方法要轻便许多,直接上代码:
<?php
class A
{
private $config;
public function __construct($config)
{
$this->config = $config;
echo 'new success config is:' . $config . "\n";
}
public function test()
{
echo 'echo' . $this->config . "\n";
}
}
function load($class, $config)
{
static $objs = array();
$class = strtolower($class);
if (isset($objs[$class]) && isset($objs[$class][$config])) {
return $objs[$class][$config];
}
if (!isset($objs[$class])) {
$objs[$class] = [];
$className = ucfirst($class);
$objs[$class][$config] = new $className($config);
return $objs[$class][$config];
}
}
$class_config1 = load('A', 'config1');
$class_config1->test();
echo "\n";
$class_config1 = load('A', 'config2');
$class_config1->test();
echo "\n";
$class_config1 = load('A', 'config1');
$class_config1->test();
echo "\n";
我们可以发现,配置为config1的构造函数只执行了一次,说明只实例化了一次
相关文章
- php观察者模式
- php工厂模式
- php设计模式-单例模式
- php设计模式之观察者模式
- PHP 实现 一致性哈希 算法(转的)
- 9月28日科技资讯|华为发布全容器化 5G 核心网;余承东评小米 MIX Aphla 手机无实用价值;PHP 新版本更新
- Linux下查看nginx、mysql、php的安装路径和编译参数
- Git PHP提交
- PHP自动加载
- PHP面向对象深入研究之【组合模式与装饰模式】
- php安全模式
- PHP CURL 相关参考
- Nginx和php-fpm通信
- 单例模式的理解【php】
- PHP AES cbc模式 pkcs7 128加密解密
- PHP 设计模式之工厂模式 (静态工厂模式)
- windows下PHP不能开启pgsql扩展的解决方法
- php实现工厂模式
- php.ini Xdebug配置
- PHP设计模式——状态模式
- PHP设计模式——备忘录模式
- PHP设计模式——中介者模式
- PHP设计模式——解释器模式
- PHP设计模式——享元模式
- PHP设计模式——门面模式
- PHP设计模式——建造者模式
- PHP设计模式——单例模式
- 【生成器】PHP的生成器yield【原创】
- 再次优化NGINX+php-fpm上传