php的抽象类和接口的总结和区别

  php对象的三大特征是封装、继承和多态,抽象类和接口是“继承”必不可少的技术,抽象类和接口有那些相同和不同之处能?下面简单介绍一下。

  1.abstract 关键字:
  1)用abstract关键字修饰的类和方法,即为抽象类或抽象方法;
  2)用abstract修饰的方法不能用private私有关键字修饰;
  3)abstract属单继承,每个类只能继承一个父类;
  4)abstact抽象类的继承对private、protected和public关键字的适用范围是:private只适用于本类不能被继承;protected适用于本类和子类,不适用于类的外部;public适用于本类、子类和类的外部。
  示例:

<?php

abstract class Person{
    
    protected $name;
    protected $country;
    
    function __construct($name = "", $country = ""){
        $this->name = $name;
        $this->country = $country;
    }
    
    abstract function say();
    abstract function eat();
    
    function run(){
        echo "使用两务腿走路!";
    }
    
}

class ChineseMan extends Person{
    
    function say(){
        echo $this->name."是".$this->country."人,讲汉语。<br>";
    }
    
    function eat(){
        echo $this->name."使用筷子吃饭。<br>";
    }
    
}

class Americans extends Person{

    function say(){
        echo $this->name."是".$this->country."人,讲英语。<br>";
    }
    
    function eat(){
        echo $this->name."使用刀和叉子吃饭。<br>";
    }
    
}

$chineseMan = new ChineseMan("高先生", "中国");
$americans = new Americans("alex", "美国");

$chineseMan->say();  //高先生是中国人,讲汉语。
$americans->say();     //alex是美国人,讲英语。

$chineseMan->eat();  //高先生使用筷子吃饭。
$americans->eat();     //alex使用刀和叉子吃饭。

 

  2.interface关键字:
  1)用interface关键字修饰的类就是接口,没有class关键字;
  2)接口内的属性只能用const关键字修饰为常量;
  3)接口内的方法全部都是抽象方法,不像abstract可以提取一部分为抽象方法;
  4)接口内的方法只能是public,且常常省略。
  5)接口属多继承,每个类可继承自多个接口,各接口名称用逗号隔开。
  格式是:

class Person implements interface1, interface2,...interfaceN{ 
    //Class contents 
}

  示例:

<?php

interface USB{
    function run();
}

class Computer{
    function useUSB($usb){
        $usb->run();
    }
}

class Ukey implements USB{
    function run(){
        echo "My name is Ukey<br>";
    }
}

class Umouse implements USB{
    function run(){
        echo "My name is Umouse<br>";
    }
}

$computer = new Computer;
$computer->useUSB(new Ukey());
$computer->useUSB(new Umouse());

 

  3.一个类可以继承一个抽象类,和多个接口,且抽象类在前,接口在后。
格式是:

class ChineseMan extends Person implements interface1,interface2,...interfaceN{
     //Class contents 
}

  示例:

<?php

//定义第一个接口
interface One{
    //只能是常量
    const CONSTANT = "CONSTANT value";
    function fun1();
    function fun2();
}

//定义第二个接口继承自第一个接口
interface Two extends One{
    function fun3();
}

//定义第三个独立接口
interface Three{
    function fun4();
}

//定义一个抽象类和一个抽象方法
abstract class Four{
    abstract function fun5();
}
//定义一个类Five要先继承抽象类Four后,再继承接口Two、Three,并且实现所有的抽象方法
class Five extends Four implements Two, Three{
    function fun1(){
        //常量输出
        echo Five::CONSTANT."<br>";
        echo __METHOD__."<br>";
    }
    
    function fun2(){
        echo __METHOD__."<br>";
    }
    
    function fun3(){
        echo __METHOD__."<br>";
    }
    
    function fun4(){
        echo __METHOD__."<br>";
    }
    
    function fun5(){
        echo __METHOD__."<br>";
    }
}

//实列化对象
$obj = new Five;
$obj->fun1();
$obj->fun2();
$obj->fun3();
$obj->fun4();
$obj->fun5();

 

posted @ 2020-06-20 15:51  孤舟残月浅笑嫣然  阅读(479)  评论(0编辑  收藏  举报