您好,登錄后才能下訂單哦!
本篇文章為大家展示了PHP中的單例模式與靜態變量是什么,代碼簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
在PHP中,沒有普遍意義上的靜態變量。與Java、C++不同,PHP中的靜態變量的存活周期僅僅是每次PHP的會話周期,所以注定了不會有Java或者C++那種靜態變量。
靜態變量在PHP中
在PHP中,靜態變量的存在意義僅僅是在某個結構體中(方法或者類)中傳遞一個變量,其作用域在此文件內。
function test(){ static $var = 1; echo $var++.''; } test(); test(); test(); //OutPut //1 //2 //3
在函數test的三次調用中,變量$var在三次調用中都是存在的,并且每次會遞增1,而并沒有清空或者重置
所以可以得出一個結論,靜態變量在當前結構體所在的生命周期中一直存在。當前的例子中,test函數的生命周期就是當前PHP腳本,只要程序沒釋放都是有效的。
靜態變量在類中
而在類中,代碼大概是這樣子的
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
從上面的類的運行結果來看,也得到了在函數中相同的結果
那么大概總結一下就是
PHP的靜態變量在所在對應的結構體的生命周期中永久存在,并且值保持一致,不論這個結構體被調用或者實例化了多少次。
其實這就是動態變量和靜態變量的區別,具體看此篇文章。動態變量只在類中有效,而靜態變量在當前php腳本。
靜態變量在單例模式中
再反過來看單例模式
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完全是同一個對象,所以之間如果需要共享數據,完全不需要靜態變量(廢話,就是自己。因為在任何時候,應用程序中都只會有這個類僅有的一個實例存在!無論你調用多少次單例,里面的數據是不會被重新實例化的。)
所以,在單例模式中,靜態變量根本就沒有存在的意義。當然,如果你沒事干,非要使用new方法來初始化對象的話,也行,此時單例模式被打破,回歸到無單例模式的狀態。
如果為了防止使用new來實例化對象,那么可以考慮對類的__construct函數設置為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來實例化的話 $c = new A(); //output //Fatal error: Call to private A::__construct() from invalid context in //如果需要A類的實例化對象,只能通過開放的get_instance靜態方法進行初始化
優點:單例模式可以避免大量的new操作,因為每一次new操作都會消耗內存資源和系統資源
缺點:在PHP中,所有的變量無論是全局變量還是類的靜態成員,都是頁面級的,每次頁面被執行時,都會重新建立新的對象,都會在頁面執行完畢后被清空,這樣似乎PHP單例模式就沒有什么意義了,所以PHP單例模式我覺得只是針對單次頁面級請求時出現多個應用場景并需要共享同一對象資源時是非常有意義的
上述內容就是PHP中的單例模式與靜態變量是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。