php抽象类和接口

1、抽象类(abstract class)

抽象类不能直接被实例化,必须先继承该抽象类,然后再实例化子类。抽象类中至少要包含一个抽象方法。如果类方法被声明为抽象的,那么其中就不能包括具体功能的实现。继承一个抽象类的时候子类中必须包含抽象类中的所有抽象方法,并且这些方法必须和抽象类中的方法一样或者更宽松,例如抽象类中的抽象方法为protected,那么子类中的方法必须为protected或者public,不能为private。例如:

//定义抽象类
abstract class AbstractClass{
    //定义子类中必须包括的方法,而且更宽松
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);
    //普通方法
    public function printOut(){
        return $this->getValue();    
    }
}
//子类  继承抽象类
class ConcreteClass1 extends AbstractClass{
    protected function getValue(){
        return "ConcreteClass1";
    }
    public function prefixValue($prefix){
        return $prefix."ConcreteClass1";
    }
}
class ConcreteClass2 extends AbstractClass{
    public function getValue(){
        return "ConcreteClass2";    
    }
    public function prefixValue($prefix){
        return $prefix."ConcreteClass2";
    }
    public function aa(){
        return "aa";    
    }
}
$class1 = new ConcreteClass1();
echo $class1->printOut().'<br />';
echo $class1->prefixValue('Foo').'<br />';

$class2 = new ConcreteClass2();
echo $class2->printOut().'<br />';
echo $class2->getValue().'<br />';
echo $class2->prefixValue('Bar').'<br />';
echo $class2->aa();

2、接口(interface)

使用接口(interface),你可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

我们可以通过interface定义一个接口,就像定义一个标准的类一样,但其中定义所有的方法都是空的。

接口中定义的所有方法必须都是public,这是接口的特性。

接口的实现使用implements

interface iTemplate{
    public function setVariable();
    public function getHtml();    
}
class Template implements iTemplate{
    public function setVariable(){
        return 'getVariable';    
    }
    public function getHtml(){
        return "getHtml";    
    }
    public function aa(){
        return 'aa';
    }
}
$template = new Template();
echo $template->setVariable();
echo $template->getHtml();
echo $template->aa();

3、接口(interface)与抽象类(abstract)的区别

抽象类可以有属性、抽象方法、和普通方法,并且方法的保护类型是向下宽松的,可以有构造方法;而接口不可以有普通方法、构造方法和属性,只可以有常量和抽象方法(无方法体保护类型必须是public);

一个类只可以继承一个抽象方法,但是可以继承多个接口

If the copyright belongs to the longfei, please indicate the source!!!
原文地址:https://www.cnblogs.com/longfeiPHP/p/4988879.html