久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

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

本篇文章為大家展示了PHP中的單例模式與靜態(tài)變量是什么,代碼簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司,專注網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計、網(wǎng)站營銷推廣,域名注冊,虛擬主機(jī),網(wǎng)站托管維護(hù)有關(guān)企業(yè)網(wǎng)站制作方案、改版、費(fèi)用等問題,請聯(lián)系成都創(chuàng)新互聯(lián)。

在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)用或者實例化了多少次。

其實這就是動態(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)用程序中都只會有這個類僅有的一個實例存在!無論你調(diào)用多少次單例,里面的數(shù)據(jù)是不會被重新實例化的。)

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

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

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

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

上述內(nèi)容就是PHP中的單例模式與靜態(tài)變量是什么,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前標(biāo)題:PHP中的單例模式與靜態(tài)變量是什么
路徑分享:http://sd-ha.com/article6/jiihog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、建站公司自適應(yīng)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)標(biāo)簽優(yōu)化、網(wǎng)頁設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名