PHP 物件導向 設計模式之單例模式

2021-09-25 06:39:20 字數 2581 閱讀 2845

單例模式要解決的問題就是「如何讓這個類只有乙個例項」。

我們的web應用中,大量使用了資料庫連線,如果反覆建立與資料

庫的連線必然消耗更多的系統資源。

我們如何解決這個問題,建立唯一的資料庫連線是必要的方式。

我們又如何知道與這個資料庫的連線是否已經建立? 還是需要現在

建立?單例模式可以解決這個問題。

先假設我們需要乙個類完成在記憶體中只有乙份的功能,我們該如何

做呢?我們一步一步的使用前面學過的知識來寫乙個單例的例子。

前面學過,每次用 new 類名 的方式,就可以建立乙個物件。我們必須禁止外部程式用 new 類名的方式來建立多個例項。

解決辦法是:我們將建構函式設定成 private ,讓建構函式只能在內部被呼叫,而外部不能呼叫。這樣,這個類就不能被外部用 new 的

方式建立多個例項了。

以下是不能被外部用new例項化的類。

<?php

class a

}

$a = new a();

?>

程式執行結果為:

fatal error: call to private a::__construct() from invalid context in e:\phpprojects\test.php on line 6

我們已經禁止外部用new例項化這個類,我們改如何讓使用者訪問這

個類呢?前門堵了,我們需要給使用者留個後門。

解決辦法是:static 修飾的方法,可以不經例項化乙個類就可以直

接訪問這個方法。

//不能用new例項化的類.

//static的方法留給外部訪問.

//在方法內部返回例項.

<?

class a

static function getclassa()

}

// 看到這裡確實返回的是 a 的例項.但不是同乙個物件.

$a1 = a::getclassa();

$a2 = a::getclassa();

echo "\$a1 的類是 ".get_class($a1)." , \$a2 是 ".get_class($a1);

if($a1 === $a2)else

?>

程式執行結果為:

$a1 的類是 a , $a2 是 a

$a1 $a2 不是乙個物件.

我們已經通過static方法返回了a的例項。但還有問題。我們如何保

證我們多次操作獲得的是同乙個例項的呢?

解決辦法:static的屬性在內部也只有乙個。static 屬效能有效的被靜態方法呼叫。將這個屬性也設定成private,以防止外部呼叫。先將這個屬性設定成 null。每次返回物件前,先判斷這個屬性是否為 null 。如果為 null 就建立這個類的新例項,並賦值給這個 static 屬性。如果不為空,就返回這個指向例項的 static 屬性。

//不能用new例項化的類.

//static的方法留給外部訪問.

//在方法內部返回例項.

//定義靜態屬性保證這個例項能被靜態方法呼叫.

//增加判斷部分.

<?

class a

static function getclassa()

return self::$a;

}

}

// 看到這裡確實返回的是 a 的例項.但不是同乙個物件.

$a1 = a::getclassa();

$a2 = a::getclassa();

echo "\$a1 的類是 ".get_class($a1)." , \$a2 是 ".get_class($a1);

if($a1 === $a2)else

?>

程式執行結果為:

$a1 的類是 a , $a2 是 a

$a1 $a2 指向同一物件.

到此,我們寫了乙個最簡單的單例模式 。

現在,你可以嘗試寫乙個應用單例設計模式的資料庫連線類。

要記住單例模式的使用效果和書寫方式。

物件導向之單例設計模式

設計模式 解決某一種問題的思想。是一種行之有效的解決方式。23種模式。單例設計模式。思想!思想!思想!解決問題 能夠保證乙個類的物件在記憶體中的唯一性。應用場景 多個成序都在操作同乙個配置檔案時,程式b需要知道程式a的結果並基於此結果進行後續操作 前提是,資料都儲存在配置檔案的物件中,要求程式a和程...

PHP物件導向 單例模式

單例模式 singleton pattern 單例模式 singleton pattern 是最簡單的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。這種模式涉及到乙個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式...

Php物件導向 單例模式

php物件導向 單例模式 保證類只有乙個例項 1.如何可以解決乙個類可以被無限地例項化?new,就能例項化一次,怎麼去限制,使用者不能無限次地new?將構造方法私有化。所有外部的new都操作失敗 class mysqldb private function construct 2.一旦構造方法私有化...