日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

浅谈PHP面向对象编程(九)

發布時間:2023/12/13 php 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈PHP面向对象编程(九) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

9.0 設計模式


  在編寫程序時經常會遇到一此典型的問題或需要完成某種特定需求,設計模式就是針對這些問題和需求,在大量的實踐中總結和理論化之后優選的代碼結構編程風格,以及解決問題的思考方式。

設計模式就像是經典的棋譜。不同的棋局,使用不同的棋諧,免得自己再去思考和模索。本節將針對PHP應用程序中最常用的兩種設計模式進行詳細講解。

9.1 單例模式


?  單例模式是PHP中的一種設計模式,它是指在設計一個類時,需要保證在整個程序運行期間針對該類只存在一個實例對象。

就像世界上只有一個月亮,假設現在要設計一個類表示月亮,該類只能有一個實例對象,否則就違背了事實。

在講解單例設計模式之前,通過一個案例來演示在什么情況時需要使用單例模式,如例9-23 所示

例9-23?

?

1 <?php 2 class dbHelper{ 3 private $conn = null; 4 public function __construct(){ 5 //打開一個到 MySQL 服務器的連接 6 $this->conn = mysql_connect("localhost","root",""); 7 echo "得到一個conn<br/>"; 8 } 9 } 10 $db1 = new dbHelper(); 11 $db2 = new dbHelper(); 12 if($db1 === $db2){ 13 echo "一個對象<br/>"; 14 } else { 15 echo "兩個對象<br/>"; 16 } 17 ?>

?

運行結果

?

得到一個conn

得到一個conn

兩個對象

?

從上例中可以看出,實例化類dbHelper的兩個對象請求的數據庫連接是兩個不同的連接,而在實際開發中,有時會有這樣的需求,

在一次HTTP 請求中,保證某個類的對象實例只能有一個。這樣可以節省資源開銷,此時可以使用單例模式。

? ? ? 單例模式(Singleton)用于為一個類生成一個唯一的對象。(請記住名詞 ? ?“”三私一公“”)

私有靜態屬性

私有構造方法

私有克隆方法

公有靜態調用隊象方法?

將上面的dbHelper 類使用單例模式來實現,如例9-24所示

例9-24

<?phpclass dbHelper{private static $instance = null;//定義一個私有的靜態屬性$instance //聲明一個構造方法 private function __construct(){ $this->conn = mysql_connect("localhost","root",""); echo "得到一個conn<br/>"; } //只有通過這個方法才能返回本類的對象,該方法是靜態方法 public static function getInstance(){ //如果本類中的$instance為空,說明它還沒有被實例化過 if(self::$instance == null){ self::$instance = new self();//實例化本類對象 } return self::$instance;//返回本類的對象 } //阻止用戶復制對象實例 public function __clone(){ } } $db1 = dbHelper::getInstance(); $db2 = dbHelper::getInstance(); if($db1 === $db2){ echo "同一個對象"; }else{ echo "不是同一個對象"; } ?>

?

運行結果

得到一個conn

同一個對象

?

在上例中,dbHelper類的構造方法使用了private 關鍵字進行了修飾,即不能在類定義之外使用new來創建對象。

如此一來就只能通過類 名直接調用getinstance0靜態方法來創建對象。在第3行代碼聲明了一個私有的靜態屬性$instance.

將實例化的對象賦值給它,再判斷該屬性,如果已經有值,就直接返回,如果其值為null, 就先實例化對象,這樣就能保證dbHelper類只能被實例化一次。

最后增加了一個私有的魔術方法_ clone0. 用于防止用戶通過clone方法復制對象。

?

?9.2 工廠模式


?

工廠模式的作用就是“生產”對象。工廠方法的參數是要生成對象的類名。

為了方便理解工廠模式的作用,接下來通過一個案例來演示如何使用工廠模式獲取MySQL和sQLite的驅動對象。

首先在根目錄下創建MySQLphp文件。示例代碼如下:

1 <?php 2 class MySQL{ 3 4 //操作SQL的驅動類 5 6 }

然后在根目錄下創建SQLite.php文件。示例代碼如下:

1 <?php 2 class SQLite{ 3 4 //操作SQLite的驅動類 5 6 }

?

?最后定義一個工廠方法來獲取各驅動對象,代碼如例9-25所示

例9-25

1 <?php 2 header('Content-Type: textml;charset=utf-8'); 3 class Db{ 4 //工廠方法 5 public static function factory($type){ 6 if (include_once $type . '.php') { 7 $classname = $type; 8 return new $classname(); 9 } else { 10 echo "出錯了!"; 11 } 12 } 13 } 14 //獲取MySQL驅動對象 15 $mysql = Db::factory('MySQL'); 16 //獲取SQLite驅動對象 17 $sqlite = Db::factory('SQLite'); 18 var_dump($mysql); 19 var_dump($sqlite); 20 ?>

?運行結果

object (MySQL) [1]

object (SQLite) [2]

?

上例中,第5行代碼定義了一個靜態方法factor(), 這就是工廠方法,該方法的參數為類名。

第6- 11行代碼用于判斷類名與參數是否相同,如果相同則創建該類的對象,否則輸出“出錯了!”。

第15 17行代碼分別調用factory()方法獲取對應的驅動對象。

從運行結果可以看出,工廠方法成功地創建了兩個驅動類對象。

轉載于:https://www.cnblogs.com/Prinlily/p/9821664.html

總結

以上是生活随笔為你收集整理的浅谈PHP面向对象编程(九)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。