标签:
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 ?>
标签:
原文地址:http://www.cnblogs.com/museluo/p/4673334.html