通过一个程序来理解PHP里面的抽象类【2】
时间:2010-09-27 来源:sunss
代码
1 <?php
2
3 header("Content-Type: text/html; charset=utf-8");
4
5 $c = new Cat("catName", "blue");
6
7 $d = new Dog("dogName", "yellow");
8
9 $b = new Bird("birdName", "flying");
10
11
12 $l1 = new Lady("liluo", $c);
13
14 $l2 = new Lady("lifeng", $d);
15
16 $l3 = new Lady("coco", $b);
17
18
19 $l1->myPetEnjoy();
20
21 $l2->myPetEnjoy();
22
23 $l3->myPetEnjoy();
24
25 //$a = new Animal("mimi"); //Animal是一个抽象的,不能实例化
26
27
28 abstract class Animal //因为这个类有抽象方法,所以这个类一定要声明为抽象类
29
30 {
31
32 private $name;
33
34 public function __construct($name)
35
36 {
37
38 $this->name = $name;
39
40 }
41
42 public abstract function enjoy(); //把这个方法定义为抽象的,用来被重写的
43
44 }
45
46
47 class Cat extends Animal //类里面的方法不想自己去实现
48
49 {
50
51 //也可以把Cat定义为abstract 类,把它的方法定义为抽象的
52
53 private $eyesColor;//让继承它的类去实现
54
55 public function __construct($name, $eyesColor)
56
57 {
58
59 $this->eyesColor = $eyesColor;
60
61 }
62
63
64
65 public function enjoy()
66
67 {
68
69 echo("猫的叫声,咪咪...... <br />");
70
71 }
72
73 }
74
75
76 class Dog extends Animal
77
78 {
79
80 private $furColor;
81
82
83
84 public function __construct($name, $furColor)
85
86 {
87
88 $this->furColor = $furColor;
89
90 }
91
92
93
94 public function enjoy()
95
96 {
97
98 echo("狗的叫声, 汪汪...... <br />");
99
100 }
101
102 }
103
104
105 class Bird extends Animal
106
107 {
108
109 private $fly;
110
111 public function __construct($name, $fly)
112
113 {
114
115 $this->fly = $fly;
116
117 }
118
119
120
121 public function enjoy()
122
123 {
124
125 echo("鸟飞得高, 唧唧喳喳...... <br />");
126
127 }
128
129 }
130
131
132 class Lady
133
134 {
135
136 private $name;
137
138 private $Animal, $pet;
139
140
141
142 public function __construct($name, $pet)
143
144 {
145
146 $this->name = $name;
147
148 $this->pet = $pet;
149
150 }
151
152
153
154 public function myPetEnjoy()
155
156 {
157
158 $this->pet->enjoy();
159
160 }
161
162 }
163
164
165 /*
166
167 php 类的特性说明
168
169
170 类中的变量须用 $this-> 访问 而变量是静态的则用 self::访问 类中的常量也一样用 self::访问,
171
172 或子类中某变量与父类中的变量同名则子类变量over父类变量,访问的是子类变量,或父中的变量是受
173
174 保护或静态的又与子类中的变量同名,则不会over而是一新的变量,或要用self::或类名:: 方式访问
175
176 变量则需在定义变量前加 static ,
177
178
179 class father
180
181 {
182
183 private $var1;
184
185 protected $var2;
186
187 public $var3;
188
189
190 function f1(){echo("kiss<br>");}
191
192 static function f2(){echo("woods<br>");}
193
194 }
195
196
197 class son extends father
198
199 {
200
201 private static $var1 = "var1";
202
203 protected $var2;
204
205 public $var3;
206
207 public static $pv = "var1";
208
209
210 function s(){echo("love<br>");}
211
212 static function s1(){echo("love<br>");}
213
214 }
215
216
217 father::f2();
218
219 son::s();
220
221 echo(son::$pv);
222
223 */
224
225 ?>
226
抽象作用:
假设有一个抽象类: <形状>
并且有三个类继承了<形状>,它们是《三角形》《矩形》《正方形》
如果开关里有一个抽象方法:
public void PrintArea() {}; //输出面积
如果《形状》类是abstract 的,那么《三角形》《矩形》《正方形》
里面都必须定义各自的计算面积的方法,如果不定义,那么就会出错,因为它们三者计算面积的方法
是不同的。
假如《三角形》类没有定义PrintArea() 方法,则程序运行在多态时,调用〈三角形〉的方法时就会
出错。
基类PrintArea() 方法的abstract 就限制了《三角形》《矩形》《正方形》必须都有自己的方法 PrintArea() ,这是abstract 规定的。
抽象作用:
假设有一个抽象类: <形状>
并且有三个类继承了<形状>,它们是《三角形》《矩形》《正方形》
如果开关里有一个抽象方法:
public void PrintArea() {}; //输出面积
如果《形状》类是abstract 的,那么《三角形》《矩形》《正方形》
里面都必须定义各自的计算面积的方法,如果不定义,那么就会出错,因为它们三者计算面积的方法
是不同的。
假如《三角形》类没有定义PrintArea() 方法,则程序运行在多态时,调用〈三角形〉的方法时就会
出错。
基类PrintArea() 方法的abstract 就限制了《三角形》《矩形》《正方形》必须都有自己的方法 PrintArea() ,这是abstract 规定的。