PHPにおけるAbstractとInterfaceの違い

14637 ワード

Abstract ClassはC++の抽象クラス概念と同様に,純虚関数(JavaとPhpではabstract method)を含むクラスをAbstract Classと呼ぶ.abstract Classをbase classと呼ぶこともあります.base classはオブジェクトを直接生成できないからです.
コードの例:
abstract class example
{
   public function xyz()
   {
    return 1;
   }
}
$a = new example();//this will throw error in php

PHPのabstract classは他のoop言語と同じように、キーワードabstractで抽象クラスを宣言します.このクラスのオブジェクトを直接生成したい場合は、エラーが発生します.abstract classは継承され実現されるために使用されます.そうしないと意味がありません.
コードの例:
abstract class testParent
{
    public function abc()
    {
        //body of your funciton
    }
}
class testChild extends testParent
{
    public function abc()
    {
        //body of your function
    }
}
$a = new testChild();//abstract class               

$a = new testChild();//abstract classの継承者であり、testChildがキーワードextendsを介して抽象クラスtestParentを継承することをインスタンス化し、testChildのオブジェクトを生成することができます.
PHPにおけるabstract methodの実現
サンプルコード:
abstract class abc
{
    abstract protected function f1($a , $b);
}
class xyz extends abc
{
    protected function f1($name , $address)
    {
        echo $name.'  '.$address;
    }
}
$a = new xyz();

abcでは、abstract method f 1をキーワードabstractで宣言します.PHPでabstract classでabstract methodを宣言すると、このclassを継承するすべてのサブクラスがこのmethodを宣言しなければなりません.そうしないと、phpはエラーを報告します.
サンプルコード:
abstract class parentTest
{
    abstract protected function f1();
    abstract public function f2();
    //abstract private function f3(); //this will trhow error
}
class childTest extends parentTest
{
    public function f1()
    {
    //body of your function
    }
    public function f2()
    {
    //body of your function
    }
    protected function f3()
    {
    //body of your function
    }
}
$a = new childTest();

privateのabstract methodが現在のクラスでしか使用できないため、privateのabstract methodがエラーを報告します.abstract classではf 1関数がprotectedであることに注意しますが、サブクラスではpublicとして宣言できます.共通の可視性よりも可視性の制限が少ないものはありません.
###############################################################
Interfaceinterfaceは、ユーザーにmethodを実装するように強制します.たとえば、1つのclassにset IDとNameの2つのプロパティが必要な場合は、このclassをinterfaceとして明示することができます.これにより、このclassから継承されたderived classはすべてsetidとsetNameの2つの操作を強制的に実現する必要があります.
コードの例:
Interface abc
{
    public function xyz($b);
}

他のoop言語と同様に、キーワードInterfaceで宣言します.このinterfaceではmethod xyzを宣言していますが、サブクラスではいつでもこのようなmethod xyzを明らかにしなければなりません.
サンプルコード:
class test implements abc
{
    public function xyz($b)
    {
    //your function body
    }
}

キーワードimplementsでinterfaceから継承できます.Interfaceではpublicのみが使用でき、protectedやprivateなどは使用できません.
サンプルコード:
interface template1
{
    public function f1();
}
interface template2 extends template1
{
    public function f2();
}
class abc implements template2
{
    public function f1()
    {
    //Your function body
    }
    public function f2()
    {
    //your function body
    }
}

classのようにextendsキーワードでinterfaceを継承することができます.ここでtemplate 2にはすべてのtemplate 1の属性が含まれるので、implementsのtemplate 2からのclass abcではfunction f 1とf 2を実装する必要があり、extendsの複数のinterfaceを実装することもできます.
interface template1
{
    public function f1();
}
interface template2
{
    public function f2();
}
interface template3 extends template1, template2
{
    public function f3();
}
class test implements template3
{
    public function f1()
    {
    //your function body
    }
    public function f2()
    {
    //your function body
    }
    public function f3()
    {
    //your function body
    }
}

同時に、あなたのclassはimplementsの複数のinterfaceもできます.
しかし、2つのinterfaceに同じ名前のmethodが含まれている場合、あなたのclassは同時に彼らをimplementすることはできません.Interfaceから継承されるmethodには、次のコードなど、同じパラメータ仕様が必要です.
コードの例:
interface template1
{
    public function f1($a)
}
class test implements template1
{
    public function f1($a)
    {
        echo $a;
    }
}
//BUT          
interface template1
{
    public function f1($a)
}
class test implements template1
{
    public function f1()
    {
        echo $a;
    }
}    

しかし、2つのmethodのパラメータを同じ名前に命名する必要はありません.次のコードは可能です.
コードの例:
interface template1
{
    public function f1($a)
}
class test implements template1
{
    public function f1($name)
    {
        echo $name;
    }
}

また、デフォルト値を使用すると、パラメータのデフォルト値を変更することもできます.次のコードは実行できます.
サンプルコード:
interface template1
{
    public function f1($a = 20)
}
class test implements template1
{
    public function f1($name  = 'xiaoming')
    {
        echo $name;
    }
}

Abstract ClassとInterfaceの違いをまとめます.
1.Abstract classではすべてのmethodが抽象的でなければならないわけではありませんが、interfaceではすべてのmethodが自動的に抽象的になります.サブクラスで宣言および実装する必要がある.Multiple inheritance(多重継承)はinterfaceの中で、1つのclassがimplementsの多くのinterfaceを同時にimplementsすることができることを意味する.しかしabstract classesではextendsに1つのclassしかありません.3.interfaceのmethodはpublicでなければならないが、abstract classではpublicまたはprotectedであってもよい.4.abstract classでは(declare)と定義(define)methodesを同時に宣言できますが、interfaceではそのmethodsしか定義できません
参考ソースphp中国語ネット