php之接口概念

  1 <?php
  2 /***
  3 类:是某一类事物的抽象,是某类对象的蓝图
  4 接口:接口本身的方法就是抽象的,不用加abstract
  5 
  6 类如果是一种事物/生物的抽象
  7 那么接口,则是事物/生物的功能的抽象
  8 即,再把他们的功能拆成小块
  9 自由组合成新的物种
 10 比如:女娲造人脑子中的形象就是人类class Human
 11 如果,女娲决定造人时,同时,形象又没最终定稿时,
 12 她脑子有哪些支离破碎的形象呢
 13 
 14 她可能会这么思考:
 15 动物:吃饭
 16 猴子:奔跑
 17 猴子:哭
 18 自己:思考
 19 小鸟:飞
 20 
 21 我造一种生物,人,应该有如下功能
 22 eat();
 23 run();
 24 cry();
 25 think();
 26 fly();
 27 
 28 ***/
 29 interface animal {
 30     public function eat();
 31 }
 32 
 33 interface monkey {
 34     public function run();
 35     public function cry();
 36 }
 37 
 38 interface wisdom {
 39     public function think();
 40 }
 41 
 42 interface bird {
 43     public function fly();
 44 }
 45 /***
 46 如上,我们把每个类中的这种实现的功能拆出来
 47 分析:如果一种新生物,实现了eat()+run()+cry()+think(),这种生物叫做人
 48 ***/
 49 class Human implements animal,monkey,wisdom{
 50     public function eat() {
 51         echo '吃';
 52     }
 53     public function run() {
 54         echo '走';
 55     }
 56     public function cry() {
 57         echo '哭';
 58     }
 59     public function think() {
 60         echo '思考';
 61     }
 62 }
 63 $lisi = new Human();
 64 $lisi->think();
 65 
 66 
 67 1:接口本身即是抽象的,内部声明的方法默认也是抽象的
 68 
 69 2:一个类可以一次性实现多个接口
 70 语法用implements 实现
 71 class ClassName implements interface1,interface2,interface3 {}
 72 然后再把接口的功能给实现
 73 
 74 3:接口也可以继承,也是用extends
 75 
 76 4:接口是一堆方法的说明,不能加属性
 77 
 78 5:接口就是供组装成类用的,封闭起来没有意义,因此方法只能是public
 79 ***/
 80 
 81 interface animal {
 82     public function eat();
 83 }
 84 
 85 interface monkey extends animal {
 86     public function run();
 87     public function cry();
 88 }
 89 
 90 interface wisdom {
 91     public function think();
 92 }
 93 
 94 interface bird {
 95     public function fly();
 96 }
 97 //下面这是错误的,因为monkey继承了animal接口,因此必须要把eat()实现才行,Fatal error: Class Human contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (animal::eat)
 98 /*
 99 class Human implements monkey,wisdom{
100     public function run() {
101         echo '走';
102     }
103     public function cry() {
104         echo '哭';
105     }
106     public function think() {
107         echo '思考';
108     }
109 }
110  */
111 class Human implements monkey,wisdom{
112     public function eat() {
113         echo '吃';
114     }
115     public function run() {
116         echo '走';
117     }
118     public function cry() {
119         echo '哭';
120     }
121     public function think() {
122         echo '思考';
123     }
124 }
125 
126 
127 
128 /***
129 面向对象的一个观点
130 做的越多,越容易犯错
131 
132 抽象类(就定义模板)--具体子类实现
133 
134 接口:
135 
136 
137 ***/
138 //抽象的数据库类
139 /***
140 创业,做网站
141 用什么数据库?mysql,oracle,sqlserver,postgresql
142 先开发网站,运行再说
143 先弄个mysql开发着,真正上线了再改数据库也不迟
144 
145 引来问题:
146 换数据库,以前的代码又得重写?
147 
148 答:不必,用抽象类
149 开发者,开发时就以db抽象类来开发
150 
151 ***/
152 abstract class db {
153     public abstract function connect($h,$u,$p);
154     public abstract function query($sql);
155     public abstract function close();
156 } 
157 
158 //下面代码有误,connect和抽象类的connect的参数不一致
159 /***
160 class mysql extends db {
161     public function connect($h,$u) {
162         return true;
163     }
164     public function query($sql,$conn) {
165 
166     }
167     public function close() {
168 
169     }
170 }
171 
172 
173 ***/
174 
175 /***
176 下面这个mysql类,严格实现了dn抽象类
177 ***/
178 class mysql extends db {
179     public function connect($h,$u,$p) {
180         return true;
181     }
182     public function query($sql) {
183 
184     }
185     public function close() {
186 
187     }
188 }
189 /***
190 试想:不管上线时,真正用什么数据库
191 我只需要再写一份如下类
192 class oracle extends db {
193 }
194 
195 class sqlserver extends db {
196 }
197 
198 class postgresql extends db {
199 }
200 
201 业务逻辑不用改
202 因为都实现的db抽象类
203 
204 我开发时,调用方法不清楚的地方,就可以参考db抽象类
205 反正子类都是严格实现类的
206 
207 ***/
208 
209 
210 /***
211 接口就更抽象了
212 
213 比如一个社交网站
214 
215 关于用户的处理是核心应用
216 
217 登陆
218 退出
219 写信
220 看信
221 招呼
222 更换心情
223 吃饭
224 骂人
225 捣乱
226 撩骚
227 
228 这么多的方法,都是用户的方法
229 自然可以写一个user类,全包装起来
230 
231 但是,分析用户一次性使不了这么多方法
232 
233 用户信息类:{登陆,写信,招呼,更换心情,退出}
234 用户娱乐类:{登陆,骂人,捣乱,示爱,撩骚,退出}
235 
236 开发网站前,分析出来这么多方法
237 但是,不能都装在一个类里
238 分成了2个类,甚至更多
239 
240 作为应用逻辑的开发,这么多的类,这么多的方法,都晕了
241 
242 
243 ***/
244 interface UserBase {
245     public function login($u,$p); 
246     public function logout();
247 }
248 
249 interface UserMsg {
250     public function writeMsg($to,$title,$content);
251     public function readMsg($from,$title);
252 }
253 
254 interface UserFun {
255     public function spit($to);
256     public function showLove($to);
257 }
258 
259 /*
260 作为调用者,我不需要了解你的用户信息类,用户娱乐类
261 我就可以知道如何调用者2个类
262 
263 因为:这2个类,都要实现上述接口
264 通过这个接口,就可以规范开发
265 */
266 
267 
268 
269 /*下面这个类,和接口声明的方法的参数不一致,就报错
270 这样,接口强制统一了类的功能
271 不管你有几个类,一个类中有几个方法
272 
273 我只知道,方法都是实现的接口的方法
274 */
275 class User implements UserBase {
276     public function login($u) {
277     }
278 }
279 ?>

 

posted @ 2015-07-24 14:05  museluo  阅读(319)  评论(0编辑  收藏  举报