亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

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

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

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

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

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

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

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

    靜態(tà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

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

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

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

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

    靜態(tà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

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

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

    如果為了防止使用new來實(shí)例化對象,那么可以考慮對類的__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來實(shí)例化的話 $c = new A(); //output //Fatal error: Call to private A::__construct() from invalid context in //如果需要A類的實(shí)例化對象,只能通過開放的get_instance靜態(tài)方法進(jìn)行初始化

    優(yōu)點(diǎn):單例模式可以避免大量的new操作,因為每一次new操作都會消耗內(nèi)存資源和系統(tǒng)資源

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

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

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