php設計模式 單例模式

2022-05-16 07:59:50 字數 2228 閱讀 9348

<?php

//簡單的單例

class singleleton

return new self();

}}$instance1 = new singleleton();

$instance2 = singleleton::getsingleleton();

// var_dump($instance1);

// var_dump($instance2);

/* 結果:object(singleleton)#1 (0) object(singleleton)#2 (0)

問題:不能防止new例項化

*/// 改進1:封鎖new 操作

class singleleton_1

return new self();

}protected function __construct(){}

}// $instance1 = new singleleton_1();

// $instance2 = singleleton_1::getsingleleton();

// var_dump($instance1);

// var_dump($instance2);

/* 結果:fatal error: uncaught error: call to protected singleleton_1::__construct() from invalid context

結論:將構造方法設定為受保護阻止以new形式格式化

問題: 乙個類繼承該類,並且使用public修飾的構造方法覆蓋了父方法,則封鎖__construct失敗

*/class child extends singleleton_1

}$ins1 = new child;

$ins2 = new child;

// 這裡用== 會得到true, 所以用===

echo $ins1 === $ins2 ? '同乙個例項' : '不同例項';

/* 結果:不同例項

*/// 改進2:使用final禁止覆蓋構造方法

class singleleton_2

return new self();

}// 當方法加final修飾,表示繼承不能被覆蓋,類加final表示不能被繼承

protected final function __construct(){}

}// class child_2 extends singleleton_2

// // }

/** * 結果:fatal error: cannot override final method singleleton_2::__construct()

* 結論:能防止方法覆蓋,導致單例失效

* 問題:不能防止轉殖,導致不同例項

*/ // 改進3: 防止轉殖

class singleleton_3

return new self();

}// 當方法加final修飾,表示繼承不能被覆蓋,類加final表示不能被繼承

protected final function __construct(){}

}$ins1 = singleleton_3::getsingleleton();

$ins2 = clone $ins1;

echo $ins1 === $ins2 ? '同乙個例項' : '不同例項'; // 不同例項

class singleleton_4

return new self();

}// 當方法加final修飾,表示繼承不能被覆蓋,類加final表示不能被繼承

protected final function __construct(){}

// 封鎖轉殖

protected final function __clone(){}

}$ins1 = singleleton_4::getsingleleton(); //fatal error: uncaught error: call to protected singleleton_4::__clone() from context

$ins2 = clone $ins1;

/** * 結論:可以將父轉殖方法設定受保護final修飾,則例項不能被轉殖

*/

總結:單例模式原理是防止類被外部例項化,通過保護類的構造方法,並在類內部通過靜態方式例項化來達到單例效果,乙個完善單例模式應該滿足一下幾點

php設計模式 單例模式

靜態方法所訪問的屬性也必須是static的。靜態方法呼叫靜態變數使用方式是self 靜態變數名 靜態方法呼叫靜態方法使用方式是self 靜態方法名 類的例項可以訪問靜態方法,但不可以訪問靜態變數 package name subpackage name category name author ad...

PHP設計模式 單例模式

單例模式就是保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。通常我們可以讓乙個全域性變數使得乙個物件被訪問,但是不能防止你例項化多個變數,乙個最好的辦法就是讓類自身負責儲存它的唯一例項,這個類可以保證沒有其它例項可被建立,並且他可以提供乙個訪問該例項的方法。下面提供兩種單例模式的例子 例1 ...

PHP設計模式 單例模式

單例模式的必要性 1.目的 確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。2.要點 1 某乙個類只能有乙個例項 2 必須自行建立這個例項 3 必須自行向整個系統提供這個例項。3.作用 避免重複例項化,節省系統資源。例如在資料庫操作方面,會大量存在資料庫連線操作,單例類可以避免多次...