php清空單例屬性 php的單例模式講解

2021-10-22 22:46:32 字數 2769 閱讀 1945

場景:

class mysql {

$my1 = new mysql();

$my2 = new mysql();

$my3 = new mysql();

每new一次,連線一次資料庫

同時,多了乙個物件,增大的開銷

另一種場景:購物車

如果我開啟多個頁面,每個頁面例項了多個購物車

那麼下的訂單,可能會被裝在不同的購物車裡,出現錯誤.

所以,購物車,也得保證,只有有乙個例項.

問:如何保證讓大家使的$my1,$my2,$my3,是同乙個物件?

//類的靜態屬性

//類的靜態屬性和其他屬性不一樣

class human{

static public $leg=2;

public $name;

public function __construct($name){

$this->name=$name;

public function showlegs(){

echo self::$leg;

$zhangsan=new human('張三');

$lisi=new human('李四');

print_r($zhangsan);// 多個物件,就有多個name普通屬性.

print_r($lisi);

$lisi->showlegs();

class human{

static public $leg=2; // 這個數字2不屬於張三,不屬於李四,而屬於全人類

static public function ins(){

echo 'aaa';

echo self::$leg;

//echo $this->name;// using $this when not in object context self 是指類本身 $this是指物件本身

public $name;

public function _construct($name){

$this->name=$name;

public function showleg(){

echo self::$leg;

$zhangsan=new human('張三');

$lisi=new human('李四');

// 不建立任何例項/物件, 呼叫human的$leg靜態屬性

human::ins();

1:靜態屬性/方法,屬於全類,而不屬於物件.

2:在記憶體中,只有乙份.

3:呼叫靜態屬性/方法,用類名::$屬性名,類名::方法名()來呼叫, 不依賴物件

//單例模式第0步

class mysql{

public $rand;

public function __construct(){

$this->rand=rand(10000,99999);

$m1=new mysql();

$m2=new mysql();

print_r($m1);

print_r($m2);

//單例模式第一步不允許進行new操作

class mysql{

public $rand;

protected function __construct($rand){

$this->rand=$rand;

$m1=new mysql;

//在類中開放乙個藉口進行例項化物件

class mysql{

public $rand;

static function ins(){

return new mysql;

protected function __construct(){

$this->rand=rand(1000,9999);

$m1=mysql::ins();

$m2=mysql::ins();

print_r($m1);

print_r($m2);

// 單例模式第3步,加判斷,判斷該類的例項是否已經存在.

class mysql{

public $rand;

static public $flag=null;

static function ins(){

if(self::$flag){

self::$flag=new mysql;

return self::$flag;

return self::$flag;

final protected function __construct(){

$this->rand=rand(1000,9999);

$m1=mysql::ins();

$m2=mysql::ins();

class my extends mysql{

public $name;

//$m1=new my();不能被new了

//$m2=new my();不能被new了

print_r($m1);

print_r($m2);

if($m1===$m2){

echo '是同乙個物件';

else{

echo "不是乙個物件";

// 問題:子類繼承時,允許同名方法覆蓋父類的同名方法,且許可權越來越寬鬆.

// 某個方法,繼承可以,但是不允許重寫.

// final,關鍵字.可以修飾類名  方法名 修飾類名的時候不能繼承 修飾方法的時候不能重寫

//還有可能通過轉殖得倒兩個物件

PHP單例模式

模式對於oop開發人員尤其有用,因為他有助於建立穩定的api,並且仍然保持一定的靈活度。一種模式可以幫助我們定義負責完成特定任務的物件,還可以允許我們全部修改掉某個類而不用修改與這些類打交道的 前者被稱為類的職責,後者被稱為類的多型性。單例模式被當作職責模式,他用來在應用程式中建立乙個單一的功能訪問...

php單例設計

class danli 建立 clone方法防止物件被複製轉殖 public function clone 單例方法,用於訪問例項的公共的靜態方法 public static function getinstance return self instance public function test...

php單例模式

單例模式 單例類 1 建構函式需要標記為private 訪問控制 防止外部 使用new操作符建立物件 單例類不能在其他類中例項化,只能被其自身例項化 2 擁有乙個儲存類的例項的靜態成員變數 3 擁有乙個訪問這個例項的公共的靜態方法 常用getinstance 方法進行例項化單例類,通過instanc...