常規類
/*
* 常規類一但被實例就會創建一個新的對象一級新的資源ID和內存空間作爲保存。
* 常規類的實例出來對象都不相等的
**/
class Obj{
public $str = null;
public function __construct(){
$this->str = mt_rand(111,999);
}
}
$s1 = new Obj();
$s2 = new Obj();
$s3 = new Obj();
print_r($s1);
print_r($s2);
print_r($s3);
結果:
Obj Object ( [str] => 931 ) Obj Object ( [str] => 978 ) Obj Object ( [str] => 779 )
單例模式
單例模式:一個類只有一個實例。而且是內部自行實例化並向整個系統全局地提供這個實例。它不會創建實例副本。而是返回單例類內部存儲的實例一個引用。
<?php
/**
* Created by PhpStorm.
* User: admin
* Date: 2019/12/25
* Time: 15:04
*/
/**
* 如何寫一個屬於自己的單例類?
* 寫一個單例類的規則:
* 1.有一個靜態成員變量來保存類的唯一實例
* 2.構造函數和克隆函數都是私有的
* 3.公共的靜態方法可以訪問類的實例作爲一個引用返回
* 4.只能實例化一次
*/
class Obj
{
protected static $_Ins;
public $str = null;
private function __construct(){
$this->str = mt_rand(111,999);
}
private function __clone()
{
}
public static function getInstance(){
if (!(self::$_Ins instanceof self)){
self::$_Ins = new self();
}
return self::$_Ins;
}
}
$s1 = Obj::getInstance();
$s2 = Obj::getInstance();
print_r($s1);
print_r($s2);
結果:
Obj Object ( [str] => 598 ) Obj Object ( [str] => 598 )
註釋
instanceof作用:(1)判斷一個對象是否是某個類的實例,(2)判斷一個對象是否實現了某個接口。
單例模式的使用場景和優缺點
- 優點:一個類不管多少次實例化,永遠只會執行一次操作。其實實例化操作都只是返回了一個對象應用。也就是說我們在沒有使用單例模式,一個對象被創建時同時也會分配一個資源ID和一個內存空間。
- 場景:
1.Session類
2.購物車
3.項目配置類
4.數據庫
5.讀取文件類
PHP單例模式的缺點
PHP動態腳本語言,也是解析型語言。那麼PHP的這種運行機制,使得PHP頁面被解析過後會回收所有相關的資源。也就是說呢?PHP是不支持變量或者對象在內存中以常駐的方式存在的。所以PHP,所有的變量無論是全局變量還是類的靜態成員都是頁面級的。每一次頁面的刷新都會創建新的對象,而解析完之後就回收。這樣一來,PHP的單例就沒有多大的意義了。但我們在實際項目當中,用戶所請求的頁面會用多個應用場景共享一個資源。那麼此時單例就很有意義了。當然我們也可以把單例對象放入到緩存中,做到強類型語言一樣的全局使用。