php之抽象类
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 ?>