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 规定的。