A. 在php中單態模式和單例模式的區別是什麼我弄不清楚是不是同一種模式
單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。如果希望在系統中某個類的對象只能存在...
B. PHP的單態設計模式
對於java轉過來程序員說是單態設計模式,在PHP上通常說是單例模式,說法不一樣,手冊上也有介紹:
單例模式(Singleton)用於為一個類生成一個唯一的對象。最常用的地方是資料庫連接。 使用單例模式生成一個對象後,該對象可以被其它眾多對象所使用。
<?php
class Example
{
// 保存類實例在此屬性中
private static $instance;
// 構造方法聲明為private,防止直接創建對象
private function __construct()
{
echo 'I am constructed';
}
// singleton 方法
public static function singleton()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
// Example類中的普通方法
public function bark()
{
echo 'Woof!';
}
// 阻止用戶復制對象實例
public function __clone()
{
trigger_error('Clone is not allowed.', E_USER_ERROR);
}
}
?>
這樣我們可以得到一個獨一無二的Example類的對象。
<?php
// 這個寫法會出錯,因為構造方法被聲明為private
$test = new Example;
// 下面將得到Example類的單例對象
$test = Example::singleton();
$test->bark();
// 復制對象將導致一個E_USER_ERROR.
$test_clone = clone $test;
?>
C. 為什麼要使用PHP單例模式及應用實例
單例模式顧名思義,就是只有一個實例。作為對象的創建模式,
單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例,這個類我們稱之為單例類。單例模式的要點有三個:一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。下面我們討論下為什麼要使用PHP單例模式?多數人都是從單例模式的字面上的意思來理解它的用途,
認為這是對系統資源的節省,
可以避免重復實例化,
是一種"計劃生育".
而PHP每次執行完頁面都是會從內存中清理掉所有的資源.
因而PHP中的單例實際每次運行都是需要重新實例化的,
這樣就失去了單例重復實例化的意義了.
單單從這個方面來說,
PHP的單例的確有點讓各位失望.
但是單例僅僅只有這個功能和應用嗎?
答案是否定的,我們一起來看看。1.
php的應用主要在於資料庫應用,
所以一個應用中會存在大量的資料庫操作,
在使用面向對象的方式開發時(廢話),
如果使用單例模式,
則可以避免大量的new
操作消耗的資源。2.
如果系統中需要有一個類來全局控制某些配置信息,
那麼使用單例模式可以很方便的實現.
這個可以參看zend
Framework的FrontController部分。
D. 怎麼理解php中的設計模式
1、單例模式:PHP中的對象生存期間是從該腳本開始一直到該腳本結束為止,因此PHP的單例模式只是在一個頁面中(這里可能包含很多其他頁面,不是狹義的單頁面)多次用到該對象時才會起作用,多次用到時不去重復的new對象(多個人做一個項目時,難免會碰到一次請求中多次實例一個對象的情況),將不會耗費不必要的資源(數據控連接操做效果很明顯),還有一點就是可以保證整個腳本中都是同一個對象,這種模式是怎麼實現的呢,他的實現有幾個要注意的點:
a. 首先就是要將__construct()方法定義為私有方法,這樣就不能通過new來得到一個新的實例了,單例模式不能在外部進行實例化,這能字自身內部進行實例化;
E. php pdo單例模式怎麼同時連接兩個資料庫
PHP pdo單例模式連接資料庫
';
if ( self::$pdo == null )
{
$host = '115.29.223.160';
$user = 'zhangwei';
$pwd = 'zhang111';
$dbname = 'wangzhan';
$dsn = "mysql:host=$host;dbname=$dbname;port=3306";
$pdo = new PDO ( $dsn, $user, $pwd );
$pdo->query('set names utf8;');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
self::$pdo = $pdo;
}
return self::$pdo;
}
public static function getStmt ( $sql )
{
$pdo = self::getPdo ();
return $pdo -> prepare( $sql );
}
}
$sql = "INSERT INTO testss (wef,wef1) VALUES(?,?)";
$stmt = Db::getStmt ( $sql );
$stmt = Db::getStmt ( $sql );
?>
輸出結果
NULL
object(PDO)#1 (0) { }
第一次null 第二次再獲取就已經有了 不用重新連接了
單利模式好處就是保存變數 他是用static保存的 所以 退出函數 變數不會釋放
關於這個問題,差不多就是這個樣子的了,你如果不明白,可以自己去後盾瞅瞅,我這些都是在後盾上學的,有空可以去看一下,就算不喜歡也沒關系啊,何樂而不為呢?
F. php設計模式之單例、多例設計模式的應用分析
本篇文章是對php設計模式中的單例與多例設計模式的應用進行了詳細的分析介紹 需要的朋友參考下單例(Singleton)模式和不常銷灶見的多例(Multiton)模式控制著應用程序中類的數量 如模式名稱 單例只能實例化一次 只有一個對象 多例模式可以多次實例化 基於Singleton的特性 我們經常用Singleton配置應用程序並定義應用程序中可能隨時訪問的變數 但有時並不推薦使用Singleton 因為它生成了一個全局狀態且 該單一根對象沒有封裝任何系統功能 多數情況下 會使單元明斗歲測試和調試變得困難 讀者根據情況自行決定 代碼示例
復制代碼 代碼如下: <?php class SingletonExample{ private function __construct(){}//防止直接實例化 public static function getInstance(){ //不與任何對象有關聯 static $instance=null; //調用此函數的所有代碼共享該變數 不必要讓其是類的靜態變數 if($instance==null){ $instance=new SingletonExample(); } return $instance; } } $obj =SingletonExample::getInstance(); $obj =SingletonExample::getInstance(); var_mp($obj ===$obj );// true 是同一個實例 ?>Multiton與singleton相似 不同的是後者需要getInstance()函數傳遞關鍵值 對於給定的關鍵值只會存在唯一的對象實例激睜 如果有多個節點 每個節點擁有唯一的表識符 且各個節點在某單次執行(如cms里的節點)可能出現多次 那麼就可以用Multiton模式實現這些節點啊 Multiton節省內存 並確保同一個對象的多個實例不發生沖突 示例
復制代碼 代碼如下: lishixin/Article/program/PHP/201311/21166
G. 什麼是PHP單例模式
PHP單例模式,就是一個對象只被生成一次,但該對象可以被其它眾多對象使用。單例模式使用最多的場景,是資料庫連接操作。我們知道,生成一個對象的操作是用new函數來實現,但是new對象都會消耗內存,而且有時候對同一個對象,在不同文件中可能會生成多次,這就造成了系統資源的浪費。然而使用單例模式,則可以很好的避免這種情況。
以資料庫為例,假設我們有一個資料庫的類,要實現資料庫連接。如果不使用單例模式,那麼在很多PHP文件中,我們可能到要創建這樣的一個連接,這其實是對資源的很大浪費。那麼下面介紹單例模式實現方法:
classDatabase
{
//定義一個屬性,該屬性是靜態的保護或私有屬性
protectedstatic$db;
//這里構造函數一定要是私有方法
privatefunction__construct()
{
}
//聲明一個獲取類實例的方法
staticfunctiongetInstace()
{
if(self::$db){
returnself::$db;
}else{
//生成自己
self::$db=newself();
returnself::$db;
}
}
}
//錯誤調用方法
//用new實例化private標記構造函數的類會報錯
$db=newDatabase();
//正確獲取實例方法
$db=Database::getInstace();
使用單例模式的好處是,當你在其他地方也要使用到這個類,比如上面的資料庫類。那麼你可以在其它地方直接調用Database::getInstace(),而且該實例只會被生成一次,不會被重復生成,所以不會浪費系統資源。
簡單的說,單例模式生成的實例只被生成一次,而且只負責一個特定的任務。
使用單例模式有下面幾個要求:
1.構造函數需要標記為private(訪問控制:防止外部代碼使用new操作符創建對象),單例類不能在其他類中實例化,只能被其自身實例化;
2.擁有一個保存類的實例的靜態成員變數;
3.擁有一個訪問這個實例的公共的靜態方法(常用getInstance()方法進行實例化單例類,通過instanceof操作符可以檢測到類是否已經被實例化);
4.如果嚴謹的話,還需要創建__clone()方法防止對象被復制(克隆)。(我上面沒創建)
使用單例模式好處,總結:
1、php的應用主要在於資料庫應用, 所以一個應用中會存在大量的資料庫操作, 使用單例模式, 則可以避免大量的new 操作消耗的資源。
2、如果系統中需要有一個類來全局控制某些配置信息, 那麼使用單例模式可以很方便的實現. 這個可以參看ZF的FrontController部分。
3、在一次頁面請求中, 便於進行調試。
參考:http://coderschool.cn/1523.html