php面向对象之-抽象类-131

<?php 
//05.php 
/**** 
燕十八 公益PHP讲堂 
论  坛: http://www.zixue.it 
微  博: http://weibo.com/Yshiba 
YY频道: 88354001 
****/ 
/*** 
====笔记部分==== 
抽象类: 无法实例化 
类前加 abstract, 此类就成为抽象类,无法实例化. 
春秋战国时期,燕零七 飞行器专家,能工巧匠. 
他写了一份图纸---飞行器制造术 
飞行器秘制图谱 
1: 要有一个有力的发动机,喷气式. 
2: 要有一个平衡舵,掌握平衡 
他的孙子问: 发动机怎么造呢? 
燕零七眼望夕阳: 我是造不出来,但我相信后代有人造出来 
总结: 
类前加 abstract 是抽象类 
方法前加 abstract 是抽象方法 
抽象类 不能 实例化 
抽象方法 不能有 方法体 
有抽象方法,则此类必是  抽象类 
抽象类,内未必有抽象方法 
但是 --- 即便全是具体方法,但类是抽象的, 
也不能实例化. 
***/ 
/**** 
代码部分 
****/ 
// 燕零七的构想,当时的科技造不出来,即这个类只能在图纸化,无法实例化. 
// 此时这个类没有具体的方法去实现,还太抽象. 
// 因此我们把他做成一个抽象类 
abstract class FlyIdea { 
    // 大力引擎,当时也没法做,这个方法也实现不了 
    // 因此方法也是抽象的 
    public abstract function engine(); 
    // 平衡舵 
    public abstract function blance(); 
    /* 
        注意:抽象方法 不能有方法体 
        下面这样写是错误的 
        public abstract function blance() { 
        } 
        Fatal error: Abstract function FlyIdea::engine() cannot contain body 
    */ 
} 
/* 
抽象类不能 new 来实例化 
下面这行是错误的 
$kongke = new FlyIdea(); 
Cannot instantiate abstract class FlyIdea 
*/ 
// 到了明朝,万户用火箭解决了发动机的问题 
abstract class Rocket extends FlyIdea { 
    // 万户把engine方法,给实现了,不再抽象了 
    public function engine() { 
        echo '点燃火药,失去平衡,嘭!<br />'; 
    } 
    // 但是万户实现不了平衡舵, 
    // 因此平衡舵对于Rocket类来说, 
    // 还是抽象的, 
    // 类也是抽象的 
} 
/* 
到了现代,燕十八亲自制作飞行器 
这个Fly类中,所以抽象方法,都已经实现了,不再是梦想. 
*/  
class Fly extends Rocket{ 
    public function engine() { 
        echo '有力一扔<br />'; 
    } 
    public function blance() { 
        echo '两个纸翼保持平衡~~~'; 
    } 
    public function start() { 
        $this->engine(); 
        for($i=0;$i<10;$i++) { 
            $this->blance(); 
            echo '平稳飞行<br />'; 
        } 
    } 
} 
$apache = new Fly(); 
$apache->start(); 
abstract class Car { 
    public function run() { 
        echo '滴滴'; 
    } 
} 
class qq extends Car { 
} 
$qq = new qq(); 
?> 



<?php 
//06.php 
/**** 
燕十八 公益PHP讲堂 
论  坛: http://www.zixue.it 
微  博: http://weibo.com/Yshiba 
YY频道: 88354001 
****/ 
/*** 
====笔记部分==== 
抽象类的意义: 
请看如下场景: 
Facebook 多国语言欢迎页面 
user登陆,有一个 c 字段,是其国家 
当各国人登陆时,看到各国语言的欢迎界面 
我们可以用面向过程的来做 
if($c == 'china') { 
    echo '你好,非死不可'; 
} else if($c =='english') { 
    echo 'hi,welcome'; 
} else if($c == 'japan') { 
    echo '搜达斯内'; 
} 
反思: 当facebook进入泰国市场时, 
增加 else if ,扩展性很差 
$c = 'english'; 
if($c == 'china') { 
    echo '你好,非死不可'; 
} else if($c =='english') { 
    echo 'hi,welcome'; 
} else if($c == 'japan') { 
    echo '搜达斯内'; 
} 
***/ 
// =====用面向对象来做======// 
/* 
让美国小组/中国开发组/斯蜜达开发组 来开发Welcome类 
争执不下: echo 到底该中? 日? 韩? 
说: 干脆在wel()方法里,判断一下? 没意义啊 
*/ 
abstract class Welcome { 
    public abstract function wel(); 
} 
// 这是首页的controller开发者 
//$wel = new Welcome(); 
//$wel->wel(); 
/* 
说:你们别争执了,我只知道,我要调用wel()方法,就是打招呼, 
你们显示什么语言和我无关. 
*/ 
/** 
经理说话: 
Welcome谁也不许动,各国开发小组开发自己的招呼类 
另:为了首页的controller开发者便于调用, 
统一继承自welcome类 
**/ 
class china extends Welcome { 
    public function wel() { 
        echo '你好,非死不可,<br />'; 
    } 
} 
class english extends Welcome { 
    public function wel() { 
        echo 'hi,welcome'; 
    } 
} 
class japan extends Welcome { 
    public function wel() { 
        echo '搜达斯奈'; 
    } 
} 
// 再看首页开发者 
$c = 'english'; // china, japan 
$wel = new $c(); 
$wel->wel(); 
/* 
以后新增了泰国语,首页的开发者,根本无需改动 
只需要增加一个泰国的welcome类 就可以了. 
所以有一些面向对象的介绍中,说面向对象的一个特点:可插拔特性 
*/ 
?>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值