抽象类与抽象方法

php5开始支持抽象类和抽象方法,用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法。

抽象类不能被实例化

<?php

abstract class Test{
    //直接报错  不能实例抽象类
}
$test =new Test();

抽象方法只能声明,不能定义其具体的功能实现(方法体)

abstract class Test{
    abstract function t(){}
    // Fatal error: Abstract function Test::t() cannot contain body in F:\Work\test.php on line 4
    //不能有方法体 也就是 {} 。
}

任何一个类,如果他里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象类。

<?php

class TTT {
    function T(){
        echo "TTTTTTTTT<br/>";
    }
    abstract function t1();
    /**  这么写是错误的
     * 类TTT包含1个抽象方法,因此必须声明为抽象类
     * Fatal error: Class TTT contains 1 abstract method and must
     * therefore be declared abstract or implement
     * the remaining methods (TTT::t1)
     */
}

正确的写法

<?php
abstract class TTT {
    function T(){
        echo "TTTTTTTTT<br/>";
    }
    abstract function t1(); 
    //正确写法
}

抽象类的继承

抽象类继承另外一个抽象类时,不用重写其中的抽象方法。

抽象类中,不能重写抽象父类的抽象方法。这样的用法,可以理解为对抽象类的扩展。

<?php

abstract class Test{
    abstract function T();

    abstract  function tt();

}
 class T extends Test{
    function T(){
        echo "我是T";
    }
    //所有抽象方法必须实现要不报错
    function  tt()
    {
        echo "我是tt";
    }

 }
$t= new T();
$t->T();  //会出两个 我是T  方法名等于类名 相当于__construct PHP7报错 但也出现

继承抽象类的非抽象类必须实现抽象类中的所有抽象方法

<?php

abstract class Test{
    abstract function T();

    abstract  function tt();

}

abstract  class test1 extends Test
{
    /*
     * abstract  function  T();
     * 不能重复定义父类的抽象方法  
     * Fatal error: Can't inherit abstract function Test::T()
     * (previously declared abstract in test1)
     */
    abstract function T2();

}

class TTT extends test1{
    function T(){
    }
    function T2(){
    }
    function tt(){}
}  //必须实现所有抽象方法

抽象类的应用

设计模式之模板模式

模板模式又叫模板方法模式,在一个类中定义一个算法的骨架,而将一些步骤延迟到子类中。


模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

业务场景:银行计算利息(interest)的时候都是以本金(principal)乘以利率(interset rate)得到.利率对每个银行都不一样,而且对于不同的存款方式和本金利率又不同。所以在账户这个类的相关方法里,我们只定义算法骨架,但不具体实现。实现由各个银行的子类来完成,

<?php
abstract class Account{
  protected  $principal=1000; //本金
  protected  $interest; //利息
    function getInterest(){
        //利息=利率*本金
        $this->interest=$this->principal * $this->getInterestRate();
        return $this->interest;
    }
    /**
     * 获取本金
     * @return mixed
     */
    public function getPrincipal()
    {
        return $this->principal;
    }

    /**
     * 获取银行利率  每个银行的利率不易样
     * @return mixed
     */
    abstract function  getInterestRate();
}

class ABC extends Account{
    function getInterestRate()
    {
        echo "我是农行的利率计算方式<br/>";
        return 0.5;
    }
}

class ICBC extends Account{
    function getInterestRate()
    {
        echo "我是工商银行的利率计算方式<br/>";
        return 0.6;
    }
}

$lisi =new ABC();
echo $lisi->getInterest();

$zhangsan =new ICBC();
echo $zhangsan->getInterest();
Last modification:January 6, 2020
如果觉得我的文章对你有用,请随意赞赏