PHP抽象类:无法实例化

一、抽象类: 无法实例化


类前加 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
*/
 
 
 
// ------------1----------到了明朝,万户用火箭解决了发动机的问题----------------------
abstract class Rocket extends FlyIdea {
 
    // 万户把engine方法,给实现了,不再抽象了
    public function engine() {
        echo '点燃火药,失去平衡,嘭!
'; } // 继承自父类,但是万户实现不了平衡舵,(还有一个抽象方法) // 因此平衡舵对于Rocket类来说, // 还是抽象的, // 类也是抽象的 因此类加一个abstract } /* ------------1----------到了现代,燕十八亲自制作飞行器---------------------- 这个Fly类中,所以抽象方法,都已经实现了,不再是梦想. */ class Fly extends Rocket{ public function engine() { echo '有力一扔
'; } public function blance() { echo '两个纸翼保持平衡~~~'; } public function start() { $this->engine(); for($i=0;$i<10;$i++) { $this->blance(); echo '平稳飞行
'; } } } $apache = new Fly(); $apache->start(); /*有力一扔 两个纸翼保持平衡~~~平稳飞行 两个纸翼保持平衡~~~平稳飞行 两个纸翼保持平衡~~~平稳飞行 两个纸翼保持平衡~~~平稳飞行 两个纸翼保持平衡~~~平稳飞行 两个纸翼保持平衡~~~平稳飞行 两个纸翼保持平衡~~~平稳飞行 两个纸翼保持平衡~~~平稳飞行 两个纸翼保持平衡~~~平稳飞行 两个纸翼保持平衡~~~平稳飞行*/ //有一个类是抽象的,但是里面的方法不是抽象的,能否new? /* 但是 --- 即便全是具体方法,但类是抽象的, 也不能实例化.*/ abstract class Car { public function run() { echo '滴滴'; } } //$qq = new qq(); 不能实例化 //解决办法》》》继承 class qq extends Car { } $qq = new qq();

总结:

  类前加 abstract 是抽象类

方法前加 abstract 是抽象方法

抽象类 不能 实例化

抽象方法 不能有 方法体

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

抽象类,内未必有抽象方法

但是 --- 即便全是具体方法,但类是抽象的,

也不能实例化.

二、抽象类的意义


请看如下场景:

Facebook 多国语言欢迎页面

user登陆,有一个 c 字段,是其国家

当各国人登陆时,看到各国语言的欢迎界面

我们可以用面向过程的来做

$c = 'english';
 
if($c == 'china') {
    echo '你好,非死不可';
} else if($c =='english') {
    echo 'hi,welcome';
} else if($c == 'japan') {
    echo '搜达斯内';
}

反思: 当facebook进入泰国市场时,

增加 else if ,扩展性很差

=====用面向对象来做======

让美国小组/中国开发组/斯蜜达开发组 来开发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 '你好,非死不可,
'; } } 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类 就可以了. 所以有一些面向对象的介绍中,说面向对象的一个特点:可插拔特性 */


你可能感兴趣的:(PHP抽象类:无法实例化)