如何实现thinkphp5实例

  介绍

小编给大家分享一下如何实现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(结果);   ?在

通过上边的实验,可以看到无论调用多少次,都会使用同一个实例。这样就解决了效率低的问题。

到现在基本就满足大多数情况了,唯一的小缺陷,就是可能实例的初始参数不同,这样没法灵活调用(常见的比如同一个程序调用两个数据库)。在上边的例子中稍作改造,以传入的参数为关键,将不通的实例缓存到数组中就可以解决。

如何实现thinkphp5实例