Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung des Unterschieds zwischen Schnittstellen und abstrakten Klassen in PHP und wie man Schnittstelleninstanzcodes definiert und vererbt

Detaillierte Erläuterung des Unterschieds zwischen Schnittstellen und abstrakten Klassen in PHP und wie man Schnittstelleninstanzcodes definiert und vererbt

伊谢尔伦
伊谢尔伦Original
2017-07-03 10:19:091612Durchsuche

Der Unterschied zwischen abstrakten Klassen und Schnittstellen

Schnittstellen sind spezielle abstrakte Klassen und können auch als Spezifikation eines Modells betrachtet werden. Der allgemeine Unterschied zwischen Schnittstellen und abstrakten Klassen ist wie folgt:

Wenn eine Unterklasse eine Schnittstelle implementiert, muss sie alle Methoden in der Schnittstelle implementieren (ob erforderlich oder nicht); wenn sie eine abstrakte Klasse erbt, benötigt sie nur die erforderlichen Methoden zu implementieren.

Wenn sich der in einer Schnittstelle definierte Methodenname ändert, müssen alle Unterklassen, die diese Schnittstelle implementieren, den Methodennamen synchron aktualisieren. Wenn sich der Methodenname in einer abstrakten Klasse ändert, ändert sich auch der entsprechende Methodenname ihrer Unterklasse Die Auswirkung besteht lediglich darin, dass es sich um eine neue Methode handelt (im Vergleich zur alten Methode implementiert).

Abstrakte Klassen können nur einzeln geerbt werden. Wenn eine Unterklasse Funktionen implementieren muss, die von mehreren übergeordneten Klassen geerbt werden müssen, muss sie Schnittstellen verwenden.

Codebeispiel:

<?php
//简单定义实现接口
interface UserInterface{  //定义user接口
    function getname();
}
interface TeacherInterface{    //定义teacher接口
    function getLengthofService();
}
class User implements UserInterface{ //实现user接口
    private $name="nostop";
    public function getName(){
        return $this->name;
    }
}
class Teacher implements TeacherInterface{ //实现teacher接口
    private $age=23;
    public function getLengthofService(){
        return $this->age;
    }
}
$user=new User();
echo $user->getName().&#39;<br />&#39;;//nostop
$teacher=new Teacher();
echo $teacher->getLengthofService().&#39;<br />&#39;;//23
//继承类实现接口
class GraduResultudent extends User implements TeacherInterface{ //继承User类 实现接口
    private $teacher;
    public function construct(){     //定义构造函数
        $this->teacher=new Teacher();  //实例化Teacher对象
    }
    public function getLengthOfService(){ //实现TeacherInterface接口的方法
        return $this->teacher->getLengthOfService();
    }
}
class Result{
    public static function getUserName(UserInterface $_user){ //注意:这里面的类型变成接口类型
        echo "Name is ".$_user->getName().&#39;<br />&#39;;
    }
    public static function getLengthOfService(TeacherInterface $_teacher){ //注意:这里面的类型变成接口类型
        echo "age is ".$_teacher->getLengthOfService();
    }
}
$object=new GraduResultudent();
Result::getUserName($object); //Name is nostop
Result::getLengthOfService($object); //age is 23
echo "<br />";
//接口实现用户的折扣
interface People{    //定义接口
    function getUserType();
    function getCount();
}
class VipUser implements People{ //实现接口
    //用户折卡系数
    private $discount=0.8;
    function getUserType(){
        return "VIP用户";
    }
    function getCount(){
        return    $this->discount;       
    }
}
$vip=new VipUser();    //实现化对象
echo $vip->getUserType().&#39;商品价格:&#39;.$vip->getCount()*100;  //VIP用户商品价格:80
class Goods{
    var $price=100;
    var $member;
    function run(People $member){ //注意:这里面的参数类型是接口类型
        $this->member=$member;
        $discount=$this->member->getCount();
        $usertype=$this->member->getUserType();
        echo $usertype."商品价格:".$this->price*$discount;
    }
}
$display=new Goods();
$display->run(new VipUser);//VIP用户商品价格:80
?>

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Unterschieds zwischen Schnittstellen und abstrakten Klassen in PHP und wie man Schnittstelleninstanzcodes definiert und vererbt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn