php之抽象类

定义

抽象类: 无法实例化
类前加 abstract, 此类就成为抽象类,无法实例化.

引出概念

春秋战国时期,燕零七 飞行器专家,能工巧匠.

他写了一份图纸—飞行器制造术

飞行器秘制图谱
1: 要有一个有力的发动机,喷气式.
2: 要有一个平衡舵,掌握平衡

他的孙子问: 发动机怎么造呢?
燕零七眼望夕阳: 我是造不出来,但我相信后代有人造出来


燕零七的构想,当时的科技造不出来,即这个类只能在图纸化,无法实例化.
此时这个类没有具体的方法去实现,还太抽象,因此我们把他做成一个抽象类。
代码

第一代

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();
//虽然不能直接实例化,但是我们可以先继承,然后再实例化

抽象类使用场景

请看如下场景:
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、付费专栏及课程。

余额充值