本文主要介绍了ThinkPHP5 instance 的简单实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。希望对大家有所帮助。
最近学习 ThinkPHP5,第一次看到 TestClass::instance() 就能创建 TestClass 实例的方法。感到很好奇,翻阅 ThinkPHP 的源代码,大体理解了 它的 设计思想,非常的先进。
老规矩,直接上代码:
<?php class TestClass { public static function instance() { return new self(); } public $data = []; public function __set($name, $val) { return $this->data[$name] = $val; } public function __get($name) { return $this->data[$name]; } } $app1 = TestClass::instance(); $app1->key = 'Application 1'; echo $app1->key . '<br />'; ?>
为了方便调用,也模仿 ThinkPHP 写了一个助手函数
<?php function app() { return TestClass::instance(); } $app2 = app(); $app2->key = 'Application 2'; echo $app2->key . '<br />'; ?>
这样就简单的实现了 instance。
不过这种方法还有一个小问题,试想以下,调用100次,就需要创建100个实例,想想都觉得可怕。
给 Test 类 增加一个 静态属性,将创建的实例保存到这里。下次如果需要调用,则直接调用这个实例。
<?php class TestClass { public static $instance; //用于缓存实例 public $data = []; public static function instance() { //如果不存在实例,则返回实例 if (empty(self::$instance)) { self::$instance = new self(); } return self::$instance; } public function __set($name, $val) { return $this->data[$name] = $val; } public function __get($name) { return $this->data[$name]; } } function app($option = []) { return TestClass::instance($option); } header('content-type:text/plain'); $result = []; $app1 = app(); $app1->key = "Application 1"; //修改 key 为 Application 1 $result['app1'] = [ 'app1' => $app1->key, //实例中 key 为 Application 1 ]; // 创建 app2,因为 instance 已经存在实例,直接返回 缓存的实例 $app2 = app(); $result['app2'] = [ 'setp1' => [ 'app1' => $app1->key, // Application 1 'app2' => $app2->key, //因为直接调用的实例的缓存,所以 key 也是 Application 1 ], ]; // 无论 app1,app2 都对在内存中 对应的同一个实例,无论通过谁修改,都能改变值 $app1->key = "Application 2"; $result['app2']['setp2'] = [ 'app1' => $app1->key, // Application 2 'app2' => $app2->key, // Application 2 ]; print_r($result); ?>
通过上边的实验,可以看到 无论调用多少次,都会使用同一个实例。这样就解决了效率低的问题。
到现在基本就满足大多数情况了,唯一的小缺陷,就是 可能 实例的 初始参数不同,这样没法灵活调用(常见的比如同一个程序调用两个数据库)。在 上边的 例子中稍作改造,以传入的参数为key,将不通的 实例缓存到数组中 就可以解决。
<?php class TestClass { public static $instance = []; //用于缓存实例数组 public $data = []; public function __construct($opt = []) { $this->data = $opt; } public static function instance($option = []) { // 根据传入的参数 通过 serialize 转换为字符串,md5 后 作为数组的 key $instance_id = md5(serialize($option)); //如果 不存在实例,则创建 if (empty(self::$instance[$instance_id])) { self::$instance[$instance_id] = new self($option); } return self::$instance[$instance_id]; } public function __set($name, $val) { return $this->data[$name] = $val; } public function __get($name) { return $this->data[$name]; } } function app($option = []) { return TestClass::instance($option); } header('content-type:text/plain'); $result = []; //传入 初始数据 $app1 = app(['key' => '123']); $result['init'] = $app1->key; // 使用 传入的数据,即:123 $app1->key = "app1"; $result['app'] = $app1->key; // 现在值改为了 自定义的 app1了 print_r($result); $result = []; // 创建 app2,注意 初始参数不一样 $app2 = app(); // 因为初始参数不一样,所以还是创建新的实例 $app2->key = "app2"; $result['app1'] = $app1->key; // app1 $result['app2'] = $app2->key; // app2 print_r($result); $result = []; // 创建 app3,传入的参数 和 app1 一样,所以会直接返回 和app1相同 的 实例 $app3 = app(['key' => '123']); $result['log'] = [ 'app1' => $app1->key, // app1 'app2' => $app2->key, // app2 'app3' => $app3->key, // app1 ]; // 设置 app3 的key,会自动修改 app1 的值,因为他们两个是同一个实例 $app3->key = 'app3'; $result['app3_set'] = [ 'app1' => $app1->key, // app3 'app2' => $app2->key, // app2 'app3' => $app3->key, // app3 ]; // 同理,设置 app1 的key,app3 的 key 也会修改 $app1->key = 'app1'; $result['app1_set'] = [ 'app1' => $app1->key, // app1 'app2' => $app2->key, // app2 'app3' => $app3->key, // app1 ]; print_r($result); ?>
相关推荐:
以上是详解ThinkPHP5 instance的实现的详细内容。更多信息请关注PHP中文网其他相关文章!

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

宝塔部署thinkphp5报错的解决办法:1、打开宝塔服务器,安装php pathinfo扩展并启用;2、配置“.access”文件,内容为“RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L]”;3、在网站管理里面,启用thinkphp的伪静态即可。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)