PHP之模板模式

科技小能手發表於2017-11-12

我們可能會遇到這種情況,為了實現一些業務邏輯,我們會對同一個物件來回重建進行業務處理


比如說做試卷,老師除了一套試卷,學生們拿到試卷只有兩個地方不一樣,填寫的答案和名字


這樣的話,整體的演算法骨架是一定的,你只需要固定出來一套題就可以,子類去修改其中一兩部


應用情境:資料庫中間層的抽象類


上程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<?php
 
//模板設計模式建立了一個實施一組方法的抽象物件,子類通常將這個物件作為模板用於自己的設計。
//一般會用於資料庫抽象類。
abstract class dbbaseInit{
    /**
     * 抽象資料庫連結
     * @param  string $host sql伺服器
     * @param  string $user 資料庫使用者名稱
     * @param  string $password 資料庫登入密碼
     * @param  string $database 資料庫
     * @param  string $charset 編碼
     * @param  string $pconnect 是否持久連結
     */ 
 
    abstract protected function connect($host,$user,$password,$database,$charset=`utf-8`,$pconnect=0);
    /**
     * 抽象資料庫執行語句
     * @param  string $sql SQL語句
     * @return obj
     */ 
 
    abstract protected function query($sql);
    /**
     * 抽象資料庫-結果集中的行數
     * @param $result 結果集
     * @return array
     */ 
 
    abstract protected function result($result,$num=1);
 
    /**
     * 抽象資料庫-從結果集中取得一行作為關聯陣列
     * @param $result 結果集
     * @return array
     */ 
    //這個方法沒用過(不是數字索引而是欄位)
    abstract protected function fetch_assoc($result);
 
     /**
     * 抽象資料庫-從結果集中取得列資訊並作為物件返回
     * @param  $result 結果集
     * @return array
     */
 
     abstract protected function fetch_fields($result);
 
      /**
     * 抽象資料庫-前一次操作影響的記錄數
     * @return int
     */ 
      //這個也沒有用過
      abstract protected function affected_rows();
 
     /**
     * 抽象資料庫-結果集中的行數
     * @param $result 結果集
     * @return int
     */ 
 
      abstract protected function num_rows($result);
 
     /**
     * 抽象資料庫-結果集中的欄位數量
     * @param $result 結果集
     * @return int
     */ 
 
     abstract protected function num_fields($result);
 
     /**
     * 抽象資料庫-獲取上一INSERT的ID值
     * @return Int
     */ 
 
     abstract protected function insert_id();
 
     /**
     * 抽象資料庫-釋放結果記憶體
     * @param obj $result 需要釋放的物件
     */ 
 
     abstract protected function free_result($result);
 
     /**
     * 抽象資料庫連結關閉
     * @param  string $sql SQL語句
     * @return obj
     */
 
     abstract protected function close();
 
     /**
     * 錯誤資訊
     * @return string
     */ 
     abstract protected function error();
 
}
 
//這是具體的某個資料庫,比如MySQL,oracle
class mysqliInit extends dbbaseInit{
    public $link_id;
    //重寫模型中的連線類
    public function connect($host,$user,$password,$database,$charset=`utf8`,pconnect=0){
        $link_id = ($pconnect==0)?mysqli_connect($host,$user,$password):mysqli_pconnect($host,$user,$password);
 
        if(!$link_iddie(`mysql connect error!`);
        mysql_query($link_id,`set names`.$charset);
        if(!mysqli_select_db($link_id,$database)) die(`database is not exist`);
 
        return $link_id;
    }
 
    public function query($sql){
        return mysqli_query($this->link_id,$sql);
    }
 
    public function result($result,$num=1){
        return mysqli_result($result,$num);
    }
 
    public function fetch_assoc($result){
        return mysqli_fetch_assoc($result);
    }
 
    public function fetch_fields($result){
        return mysqli_num_fields($result);
    }
 
    public function free_result($result){
        return mysqli_free_result($result);
    }
 
    public function insert_id(){
        return mysqli_insert_id($this->link_id);
    }
 
    public function affected_rows() { 
        return mysqli_affected_rows($this->link_id); 
    }
 
    public function close(){
        if($this->link_id!==null) $mysqli_close($this->link_id);
        $this->link_id = null;
        return true;
    }
 
    public function error(){
        return mysqli_error($this->link_id);
    }
}
?>



有點累了,設計模式常用的先學到這裡,後續的以後再說,


願法界眾生,皆得安樂

本文轉自 jackdongting 51CTO部落格,原文連結:http://blog.51cto.com/10725691/1954849


相關文章