抽象类

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

春秋战国时期

春秋战国时期,007 飞行器专家,能工巧匠.
他写了一份图纸---飞行器制造术

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

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

<?php
//007的构想,当时的科技造不出来,即这个类智能在图纸上,无法实例化
//此时这个类没有具体的方法去实现,还太抽象.
//因此我们把他做成一个抽象类

abstract class FlyIdea{
    //大力引擎,当时也没法做,
    //因此这个方法也是抽象的
    abstract public function engine();
    //平衡舵
    abstract public function blance();
    /*注意抽象方法不能有方法体
    abstract public function blance(){
       //这样写是错误的
    }
    Fatal error: Abstract function FlyIdea::engine() cannot contain body in D:\wamp2\www\PHPoop\501abstract.class.php on line 28
    */
}

//抽象类不能 new 来实例化
$kong = new FlyIdea();

到了明朝

来了个万户的人,他用火箭解决了发动机的问题

abstract class Rocket extends FlyIdea {
    //万户把 engine 方法给实现了
    public function engine(){
            echo "点燃火药,失去平衡,嘭";
    }
    //但是万户实现不了平衡舵
    //因此平衡舵对于 Rocket 来说还是抽象的
    //类也是抽象的
}

到了现代

到了现代,我来亲自做飞行器
所有方法都已经实现

class Fly extends Rocket{
    public function engine(){
            echo "用力一扔<br/>";
    }
    public function blance(){
            echo "两个纸翼保持平衡<br>";
    }
    public function start(){
            $this->engine();
            $this->blance();
            for ($i=0; $i < 10; $i++) { 
                    echo "平稳飞行...<br>";
            }
    }
}

$apache = new Fly();

$apache->start();

/*
总结:
类前加 abstract 是抽象类,
方法前加 abstract 是抽象方法

抽象类 不能实例化
抽象方法不能有方法体,

有抽象方法,则此类必是抽象类
抽象类内未必有抽象方法

但是 --- 即便全是具体方法,但类是抽象的也是不能实例化的
*/

abstract class Car {
	public function run(){
		echo "didi";
	}
}

class QQ extends Car {

}

$qq = new QQ();
$qq->run();

抽象类的意义

请看如下场景:

facebook 多国语言欢迎页面
user登录,有一个 c 字段,是其国家
当各国人登录时,看到是各国语言的欢迎面

用面向过程来做

$c = 'china'
if($c == 'china'){
	echo "你好,非死不可";
}else if($c == 'english'){
	echo 'hi,welcome';
}else{
	echo '没有了';
}

反思: 当facebook进入泰国时,
增加 else if ,扩展性很差

用面向对象来做

让美国小组/中国小组/思密达开发组 来开发Welcome类

争执不下: echo 到底是该 中? 美? 韩?
说: 干脆在 wel()方法里,判断一下?

<?php
class Welcome {
    public function wel(){
            echo "";
    }
}

$wel = new Welcome();
$wel->wel();
/*
说: 你们别争执了,我只知道,我要调用wel()方法,就是打招呼
你们显示什么语音和我无关
*/

经理说话,
Welcome类谁也不许动,
你们各自开发自己的招呼类

另: 为了首页的controller开发者便于调用,
统一继承下Welcome类

<?php

abstract class Welcome {
	abstract public function wel();
}

class China extends Welcome {
	public function wel(){
		echo "你好,非死不可<br>";
	}
}

class english extends Welcome{
	public function wel(){
		echo "hi,welcome";
	}
}

class han extends Welcome{
	public function wel(){
		echo "노력을 다한 후에 하늘의 뜻을 기다린다";
	}
}


//这是首页的开发者
$c = 'han';//china,english/han
$wel = new $c();
$wel->wel();

以后新增了泰国语,首页的开发者,根本无需改动,
只需要增加一个泰国的招呼类(继承自Welcome类)就好了

所以有一些面向对象的介绍中说面向对象的一个特点:
可插拔特性