場景:
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...