久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      聊聊PHP中的單例模式與靜態(tài)變量

      聊聊PHP中的單例模式與靜態(tài)變量

      在PHP中,沒(méi)有普遍意義上的靜態(tài)變量。與Java、C++不同,PHP中的靜態(tài)變量的存活周期僅僅是每次PHP的會(huì)話周期,所以注定了不會(huì)有Java或者C++那種靜態(tài)變量。

      靜態(tài)變量在PHP中

      在PHP中,靜態(tài)變量的存在意義僅僅是在某個(gè)結(jié)構(gòu)體中(方法或者類(lèi))中傳遞一個(gè)變量,其作用域在此文件內(nèi)。

      function test(){     static $var = 1;      echo $var++.''; } test(); test(); test(); //OutPut //1 //2 //3

      在函數(shù)test的三次調(diào)用中,變量$var在三次調(diào)用中都是存在的,并且每次會(huì)遞增1,而并沒(méi)有清空或者重置
      所以可以得出一個(gè)結(jié)論,靜態(tài)變量在當(dāng)前結(jié)構(gòu)體所在的生命周期中一直存在。當(dāng)前的例子中,test函數(shù)的生命周期就是當(dāng)前PHP腳本,只要程序沒(méi)釋放都是有效的。

      靜態(tài)變量在類(lèi)中

      而在類(lèi)中,代碼大概是這樣子的

      class A {     private static $a = 1;      private $b = 2;     public function add()     {         echo self::$a++.'';         echo $this->b++.'';     } } $class1 = new A(); $class1->add(); $class1->add(); $class2 = new A(); $class2->add(); $class2->add(); //Output //1 //2 //2 //3 //3 //2 //4 //3

      從上面的類(lèi)的運(yùn)行結(jié)果來(lái)看,也得到了在函數(shù)中相同的結(jié)果

      那么大概總結(jié)一下就是

      PHP的靜態(tài)變量在所在對(duì)應(yīng)的結(jié)構(gòu)體的生命周期中永久存在,并且值保持一致,不論這個(gè)結(jié)構(gòu)體被調(diào)用或者實(shí)例化了多少次。

      其實(shí)這就是動(dòng)態(tài)變量和靜態(tài)變量的區(qū)別,具體看此篇文章。動(dòng)態(tài)變量只在類(lèi)中有效,而靜態(tài)變量在當(dāng)前php腳本。

      靜態(tài)變量在單例模式中

      再反過(guò)來(lái)看單例模式

      class A {     private static $instance = null;     private $b = 1;     public static function get_instance()     {         if(self::$instance == null){             $classname = __CLASS__;             self::$instance = new $classname();          }         return self::$instance;     }     public function add()     {         $this->b++;     }     public function show()     {         echo $this->b;     } } $a = A::get_instance(); $b = A::get_instance(); //此處$a和$b變量完全相同! $a->add(); $a->show(); echo ''; $b->show(); //output //2 //2

      此時(shí),由于單例模式存在,使得$a和$b完全是同一個(gè)對(duì)象,所以之間如果需要共享數(shù)據(jù),完全不需要靜態(tài)變量(廢話,就是自己。因?yàn)樵谌魏螘r(shí)候,應(yīng)用程序中都只會(huì)有這個(gè)類(lèi)僅有的一個(gè)實(shí)例存在!無(wú)論你調(diào)用多少次單例,里面的數(shù)據(jù)是不會(huì)被重新實(shí)例化的。)

      所以,在單例模式中,靜態(tài)變量根本就沒(méi)有存在的意義。當(dāng)然,如果你沒(méi)事干,非要使用new方法來(lái)初始化對(duì)象的話,也行,此時(shí)單例模式被打破,回歸到無(wú)單例模式的狀態(tài)。

      如果為了防止使用new來(lái)實(shí)例化對(duì)象,那么可以考慮對(duì)類(lèi)的__construct函數(shù)設(shè)置為private屬性

      class A {     private static $instance = null;     private $b = 1;     private function __construct()     {     //Code in this function     //could not be get out of the class     }     public static function get_instance()     {         if(self::$instance == null){             $classname = __CLASS__;             self::$instance = new $classname();         }         return self::$instance;     }     public function add()     {         $this->b++;     }     public function show()     {         echo $this->b;     } } $a = A::get_instance(); $b = A::get_instance(); //此處$a和$b 變量完全相同! $a->add(); $a->show(); echo ' '; $b->show(); //output //2 //2    //如果嘗試用new來(lái)實(shí)例化的話 $c = new A(); //output //Fatal error: Call to private A::__construct() from invalid context in //如果需要A類(lèi)的實(shí)例化對(duì)象,只能通過(guò)開(kāi)放的get_instance靜態(tài)方法進(jìn)行初始化

      優(yōu)點(diǎn):?jiǎn)卫J娇梢员苊獯罅康膎ew操作,因?yàn)槊恳淮蝞ew操作都會(huì)消耗內(nèi)存資源和系統(tǒng)資源

      缺點(diǎn):在PHP中,所有的變量無(wú)論是全局變量還是類(lèi)的靜態(tài)成員,都是頁(yè)面級(jí)的,每次頁(yè)面被執(zhí)行時(shí),都會(huì)重新建立新的對(duì)象,都會(huì)在頁(yè)面執(zhí)行完畢后被清空,這樣似乎PHP單例模式就沒(méi)有什么意義了,所以PHP單例模式我覺(jué)得只是針對(duì)單次頁(yè)面級(jí)請(qǐng)求時(shí)出現(xiàn)多個(gè)應(yīng)用場(chǎng)景并需要共享同一對(duì)象資源時(shí)是非常有意義的

      相關(guān)教程推薦:《PHP教程》

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)