抽象类和接口的区别

从应用角度来讲

接口:

/**
 * 接口是一种特殊的抽象类
 * 只能用public修饰,只能存放常量,只能约定方法不能约定方法体
 */
interface InterfaceDemo {
    //只能放常量
    const STATUS = 1;
    //只能约定方法不能约定方法体
    public function show();
}
interface InterfaceDemoTwo {
    //只能放常量
    const STATUS_TWO = 2;
    //只能约定方法不能约定方法体
    public function showTwo();
}

//接口实现通过关键字implements去实现,同时可以进行多个接口继承
class SonDemo implements InterfaceDemo, InterfaceDemoTwo {
    //来自接口InterfaceDemo
    public function show()
    {
       return self::STATUS;
        // InterfaceDemo 中的方法
    }
    //来自接口InterfaceDemoTwo
    public function showTwo()
    {
        //self会找到当前接口中的常量
       return self::STATUS_TWO;
        // InterfaceDemo1 中的方法
    }
}

$demo = new SonDemo();
echo $demo->show();
echo $demo->showTwo();
echo PHP_EOL;

抽象类:

/**
 * 定义抽象类需要用abstract关键字修饰
 * 定义的抽象类不能直接使用,必须通过继承才能使用
 * 如果类中有任何一个方法是抽象声明的,那这个类必须是抽象类。
 * 抽象类中的抽象方法不能写方法实体,例如:abstract public function getName()
 * 抽象类中可以写普通方法,例如:public function show(){...}
 * 抽象类中声明权限,子类继承时应该>=父类中的权限,如父protected声明过后的,子类必须是>=protected声明级别的
 * 抽象类中的抽象方法必须由子类重写
 */
abstract class abstractDemo
{
    //属性
    protected $name;
    public $age;
    private $sex;

    //非抽象方法 构造函数
    public function __construct($info = [])
    {
        $this->name = $info['name'];
        $this->age = $info['age'];
        $this->sex = $info['sex'];
    }

    //抽象方法,抽象方法必须由子类重写!
    abstract public function getAge();
    //抽象方法,抽象方法必须由子类重写!
    abstract public function setAge($age);

    /**
     * 普通方法,非抽象方法,类似于普通类中的方法,子类可以集成或重写
     */
    public function showInfo()
    {
        echo  '名字:'.$this->name.'年龄:'.$this->age.'性别:'.$this->sex.PHP_EOL;
    }
}

/**
 * 抽象类必须由子类集成才能使用
 * extends完成继承,只能进行一个抽象类的集成不能进行多个抽象类的继承
 */
class SonDemo extends abstractDemo
{

    /**
     * 子类的构造函数
     */
    public function __construct($info = [])
    {
        //TODO:子类要做的事情,我这里没有定义子类要做的事情,只是调用了父类

        //子类构造函数的参数拿到以后交给父类
        parent::__construct($info);
    }

    public function showInfo()
    {
        echo '我收到了小红的信息:'.$this->age.PHP_EOL;
        parent::showInfo();
    }

    public function setAge($age)
    {
        //拿到父类中的属
       $this->age = $age;
    }

    public function getAge()
    {
        echo '年龄:'.$this->age.PHP_EOL;
    }
}
$info = [
    'name' => '小红',
    'age' => 18,
    'sex' => '女',
];
$demo = new SonDemo($info);
$demo->showInfo();
$demo->setAge(26);
$demo->showInfo();
$demo->getAge();

抽象类实例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PHP开光程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值