介绍
小编给大家分享一下如何实现thinkphp5实例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
最近学习thinkphp5,第一次看到TestClass::实例()就能创建TestClass实例的方法。感到很好奇,翻阅ThinkPHP的源代码,大体理解了它的设计思想,非常的先进。
再次从零造车一次(昨天的造车:angularjs的数组传参方式的简单实现http://www.miaoqiyuan.cn/p/an..。),来讲讲他的具体实现。本文(thinkphp5实例的简单实现)为原创文章,原文地址:http://www.miaoqiyuan.cn/p/ph..,转载请注明出处。
老规矩,直接上代码:
& lt; php ? class TestClass  { , ,,,public static function 实例(),{ ,,,,,,,return new 自我(); ,,,} , ,,,public data 美元;=,[]; , ,,,public function __set(名称、美元,美元val), { ,,,,,,,return $ this→数据[名字]美元,=,val美元; ,,,} , ,,,public function __get(名字),{ ,,,,,,,return $ this→数据(美元的名字); ,,,} } , $ app1 =, TestClass:实例(); 时间=美元app1→key & # 39; Application 1 & # 39;; echo app1→美元key 只& # 39;& lt; br /祝辞;& # 39;; ?在
为了方便调用,也模仿ThinkPHP写了一个助手函数
& lt; php ? function 应用程序(),{ ,,,return TestClass:实例(); } , 时间=美元app2 应用(); 时间=美元app2→key & # 39; Application 2 & # 39;; echo app2→美元key 只& # 39;& lt; br /祝辞;& # 39;; ?在
这样就简单的实现了实例。
不过这种方法还有一个小问题,试想以下,调用100次,就需要创建100个实例,想想都觉得可怕。
给测试类增加一个静态属性,将创建的实例保存到这里。下次如果需要调用,则直接调用这个实例。
& lt; php ? class TestClass  { , ,,,public static 实例;美元,//用于缓存实例 , ,,,public data 美元;=,[]; , ,,,public static function 实例(),{ ,,,,,,,//如果不存在实例,则返回实例 ,,,,,,,if (空(self::实例)美元),{ ,,,,,,,,,,,self:: $ instance =, new 自我(); ,,,,,,,} ,,,,,,,return 自我::$实例; ,,,} , ,,,public function __set(名称、美元,美元val), { ,,,,,,,return $ this→数据[名字]美元,=,val美元; ,,,} , ,,,public function __get(名字),{ ,,,,,,,return $ this→数据(美元的名字); ,,,} , } , function 应用程序($ option =, []), { ,,,return TestClass:实例(选项); } , 头(& # 39;内容类型:文本/平原# 39;); , $ result =, []; 时间=美元app1 应用();=$ app1→key “Application 1“,//修改,key 为Application 1 $结果[& # 39;app1 # 39;],=, ( ,,,& # 39;app1 # 39;,=祝辞,美元app1→键,,//实例中,key 为Application 1 ]; ,//,创建,app2,因为,instance 已经存在实例,直接返回,缓存的实例 时间=美元app2 应用(); $结果[& # 39;app2 # 39;],=, ( ,,,& # 39;setp1& # 39;,=祝辞,( ,,,,,,,& # 39;app1 # 39;,=祝辞,美元app1→键,,//Application 1 ,,,,,,,& # 39;app2 # 39;,=祝辞,美元app2→键,,//因为直接调用的实例的缓存,所以,key 也是,Application 1 ,,,, ]; ,//,无论,app1, app2 都对在内存中,对应的同一个实例,无论通过谁修改,都能改变值 时间=美元app1→key “Application 2“;; $结果[& # 39;app2 # 39;] [& # 39; setp2& # 39;],=, ( ,,,& # 39;app1 # 39;,=祝辞,美元app1→键,,//Application 2 ,,,& # 39;app2 # 39;,=祝辞,美元app2→键,,//Application 2 ]; print_r(结果); ?在
通过上边的实验,可以看到无论调用多少次,都会使用同一个实例。这样就解决了效率低的问题。
到现在基本就满足大多数情况了,唯一的小缺陷,就是可能实例的初始参数不同,这样没法灵活调用(常见的比如同一个程序调用两个数据库)。在上边的例子中稍作改造,以传入的参数为关键,将不通的实例缓存到数组中就可以解决。