1 <?php
2 /***
3 抽象类:无法实例化,即不能new
4 类前加abstract,此类就成为抽象类
5
6 总结:
7 类前加abstract是抽象类
8 方法前加abstract是抽象方法
9
10 抽象类不能实例化
11 抽象方法不能有实体
12
13 有抽象方法,则此类必是抽象类
14 抽象类内,不一定有抽象方法
15
16 即便全是具体方法,但类是抽象的,也不能实例化
17
18 ***/
19 //古人有制造飞机的构想
20 abstract class FlyIdea {
21 //抽象引擎,暂时无法实现,抽象方法,不能有函数体,即不能有{},结尾要加;
22 public abstract function engine();
23 //抽象平衡舵,也是无法实现
24 public abstract function balance();
25
26 }
27
28 //明朝万户实现了引擎,平衡舵还没实现,因此类还是抽象的
29 abstract class Rocket extends FlyIdea {
30 public function engine() {
31 echo '点燃火药,起飞<br />';
32 }
33 }
34
35 //后来的人实现了平衡舵,所有抽象方法都实现了,类不再是抽象的,是具体的了,可以new了
36 class Fly extends Rocket {
37 public function balance() {
38 echo '两个纸翼保持平衡~~~';
39 }
40 public function start(){
41 $this->engine();
42 for ($i = 0; $i < 10; $i++) {
43 $this->balance();
44 echo '平稳飞行<br />';
45 }
46 }
47 }
48 $apache = new Fly();
49 $apache->start();
50
51
52
53 /***
54 请看如下情景:
55 facebook 多国语言欢迎页面
56
57 user登陆,有一个c字段,是其国家
58 当各国人登陆时,看到各国语言的欢迎页面
59
60 用面向过程思路来做
61
62 $c = 'china';
63
64 if ($c == 'china') {
65 echo '你好,欢迎你';
66 }else if ($c == 'english') {
67 echo 'hello,welcome';
68 }else if ($c == 'japan') {
69 echo '哦嗨哟';
70 }
71
72 反思:当facebook进入泰国市场时,增加else if,扩展性很差
73 ***/
74
75
76 /***
77 用面向对象思路来做
78 开发者开发时
79 知道子类都继承自一个抽象父类
80 因此,可以不用去关心到底是哪个子类
81 因为子类的规格和抽象的父类一致
82
83 ***/
84 //抽象一个类
85 abstract class Welcome {
86 //抽象一个方法,做模板
87 abstract public function wel();
88 }
89
90 //继承抽象类
91 class china extends Welcome {
92 public function wel() {
93 echo '你好,欢迎你';
94 }
95
96 }
97 class english extends Welcome {
98 public function wel() {
99 echo 'hello,welcome';
100 }
101 }
102 class japan extends Welcome {
103 public function wel() {
104 echo '哦嗨哟';
105 }
106 }
107 $c = 'china';//english/japan
108 $wel = new $c();
109 $wel->wel();
110 /***
111 以后增加泰国的语言,只需增加一个泰国的welcome类就可以了
112 所以有一些面向对象的介绍中,说面向对象的一个特点是:可插拔特性
113 ***/
114 ?>