PHP的类,abstract类,interface及关键字extends和implements

原文:https://blog.csdn.net/qq_19557947/article/details/77880757?locationNum=4&fps=1

PHP类

PHP类是单继承,也就是不支持多继承,当一个类需要多个类的功能时,继承就无能为力了

abstract

用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法。

抽象方法是只有方法声明,而没有方法的实现内容。

抽象类不能被实例化,通常是将抽象方法做为子类方法重写使用的,且要把继承的抽象类里的方法都实现。

abstract class AbstractClass{
      //定义抽象方法
      abstract protected function getValue();
      //普通方法
      public function printOut(){
            echo $this->getValue();
      }
}
 
class CommonClass extends AbstractClass{
      protected function getValue(){
            return "抽象方法的实现";
      }
}
 
$class1 = new CommonClass();
$class1->printOut();

extends

extends是继承某个类,继承之后可以使用父类的方法,也可以重写父类的方法,

如果类被声明为final,则不能被继承。

implements

implements是实现多个接口,接口的方法一般为空,必须重写才能使用

interface

如果一个抽象类里的所有方法都是抽象方法,且没有声明变量,所有成员都是public权限,那么这种特殊的抽象类就叫 接口

interface即PHP接口,并用关键字implements来实现接口中方法,且必须完全实现。

例:

//定义接口
interface User{
     function getDiscount();
     function getUserType();
}
//VIP用户 接口实现
class VipUser implements User{
      //VIP用户折扣系数
      private $discount = 0.8;
      function getDiscount(){
            return $this->discount;
      }
      function getUserType(){
            return 'VIP';
      }
}
class Goods{
      var $price =100;
      var $vc;
      //定义User接口类型参数,这时并不知道是什么用户
      function run(User $vc){
            $this->vc=$vc;
            $discount = $this->vc->getDiscount();
            $usertype = $this->vc->getUserType();
            echo $usertype.'商品价格:'.$this->pirce*$discount;
      }
}
$display = new Goods();
$display->run(new VipUser());

输出:VIP商品价格:80

该例子中,User接口中实现用户的折扣,而在VipUser类里面实现了具体的折扣系数,最后商品类Goods根据user接口来实现不同用户报价

实现多个接口

PHP也可以在继承一个类的时候同时实现多个接口

class 子类 extends 父类 implements 接口1,接口2,...
{
     ......
}

抽象类和接口的区别

接口是一个特殊的抽象类,也可以看作是一个模型的规范,接口与抽象类大致区别如下:

1,一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法即可

2,如果一个接口中定义的方法名改变了,那么所有市县次接口的子类需要同更新方法名,而抽象类中如果方法名改变了,其子类对应的方法名将不受影响,只是变成了一个新的方法而已

3,抽象类只能单继承,当一个子类需要实现的功能需要集成多个父类,就必须适用接口。

原文地址:https://www.cnblogs.com/jiangxiaobo/p/9607867.html