web-dev-qa-db-ja.com

PHPの抽象クラスとは何ですか?

PHPの抽象クラスとは何ですか?どこで使用できますか?

100
udaya

抽象クラスは、少なくとも1つの抽象メソッドを含むクラスです。抽象メソッドは、実際のコードが含まれていないメソッドで、名前とパラメーターのみが含まれ、「抽象」とマークされています。

これの目的は、継承するクラスから抽象メソッドを実装するためのテンプレートを提供することです。

したがって、抽象クラスは、通常のクラスと純粋なインターフェースの間の何かです。また、インターフェイスは、すべてのメソッドが抽象である抽象クラスの特殊なケースです。

詳細については、PHPマニュアルの このセクション を参照してください。

116
selfawaresoup

抽象クラスは、1つ以上の抽象メソッドを含むクラスです。抽象メソッドは宣言されたメソッドですが、実装は含まれていません。抽象クラスはインスタンス化されない場合があり、抽象メソッドの実装を提供するにはサブクラスが必要です。

1。抽象クラスをインスタンス化できません:抽象として定義されたクラスはインスタンス化できません。少なくとも1つの抽象メソッドを含むクラスも抽象クラスでなければなりません。

以下の例:

abstract class AbstractClass
{

    abstract protected function getValue();
    abstract protected function prefixValue($prefix);


    public function printOut() {
        echo "Hello how are you?";
    }
}

$obj=new AbstractClass();
$obj->printOut();
//Fatal error: Cannot instantiate abstract class AbstractClass

2。少なくとも1つの抽象メソッドを含むクラスも抽象である必要があります:抽象クラスには抽象メソッドと非抽象メソッドを含めることができますが、少なくとも1つの抽象メソッドを含める必要があります。クラスに少なくとも1つの抽象メソッドがある場合、そのクラスは抽象として宣言する必要があります。

注:トレイトは、表示するクラスに要件を課すために抽象メソッドの使用をサポートします。

以下の例:

class Non_Abstract_Class
{
   abstract protected function getValue();

    public function printOut() {
        echo "Hello how are you?";
    }
}

$obj=new Non_Abstract_Class();
$obj->printOut();
//Fatal error: Class Non_Abstract_Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Non_Abstract_Class::getValue)

。抽象メソッドにはボディを含めることはできません:抽象として定義されたメソッドは、メソッドの署名を宣言するだけです-実装を定義できません。ただし、非抽象メソッドで実装を定義できます。

abstract class AbstractClass
{
   abstract protected function getValue(){
   return "Hello how are you?";
   }

    public function printOut() {
        echo $this->getValue() . "\n";
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
//Fatal error: Abstract function AbstractClass::getValue() cannot contain body

4。抽象クラスから継承する場合、親のクラス宣言で抽象とマークされたすべてのメソッドは子によって定義する必要があります:抽象クラスを継承する場合、その中のすべての抽象メソッドに実装を提供する必要があります。

abstract class AbstractClass
{
    // Force Extending class to define this method
    abstract protected function getValue();

    // Common method
    public function printOut() {
        print $this->getValue() . "<br/>";
    }
}

class ConcreteClass1 extends AbstractClass
{
    public function printOut() {
        echo "dhairya";
    }

}
$class1 = new ConcreteClass1;
$class1->printOut();
//Fatal error: Class ConcreteClass1 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue)

5。同じ(またはそれほど制限されない)可視性:抽象クラスから継承する場合、親のクラス宣言で抽象とマークされたすべてのメソッドは、子によって定義される必要があります。さらに、これらのメソッドは、同じ(またはより制限の少ない)可視性で定義する必要があります。たとえば、抽象メソッドが保護されていると定義されている場合、関数実装は保護されているかパブリックであるがプライベートではないとして定義する必要があります。

抽象メソッドはプライベートにしないでください。

abstract class AbstractClass
{

    abstract public function getValue();
    abstract protected function prefixValue($prefix);

        public function printOut() {
        print $this->getValue();
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."<br/>";
//Fatal error: Access level to ConcreteClass1::getValue() must be public (as in class AbstractClass)

6。抽象メソッドの署名は一致する必要があります:抽象クラスから継承する場合、親のクラス宣言で抽象とマークされたすべてのメソッドは子によって定義する必要があります。メソッドの署名は一致する必要があります。型のヒントと必要な引数の数は同じでなければなりません。たとえば、抽象メソッドの署名が定義されていない子クラスがオプションの引数を定義している場合、署名に競合はありません。

abstract class AbstractClass
{

    abstract protected function prefixName($name);

}

class ConcreteClass extends AbstractClass
{


    public function prefixName($name, $separator = ".") {
        if ($name == "Pacman") {
            $prefix = "Mr";
        } elseif ($name == "Pacwoman") {
            $prefix = "Mrs";
        } else {
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}

$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "<br/>";
echo $class->prefixName("Pacwoman"), "<br/>";
//output: Mr. Pacman
//        Mrs. Pacwoman

7。抽象クラスは多重継承をサポートしていません:抽象クラスは別の抽象クラスを拡張でき、抽象クラスはインターフェースの実装を提供できます。しかし、多重継承はサポートしていません。

interface MyInterface{
    public function foo();
    public function bar();
}

abstract class MyAbstract1{
    abstract public function baz();
}


abstract class MyAbstract2 extends MyAbstract1 implements MyInterface{
    public function foo(){ echo "foo"; }
    public function bar(){ echo "bar"; }
    public function baz(){ echo "baz"; }
}

class MyClass extends MyAbstract2{
}

$obj=new MyClass;
$obj->foo();
$obj->bar();
$obj->baz();
//output: foobarbaz

注:コード内のクラスの順序または位置は、インタープリターに影響を与え、致命的なエラーを引き起こす可能性があることに注意してください。したがって、複数レベルの抽象化を使用する場合は、ソースコード内のクラスの配置に注意してください。

以下の例では、致命的なエラー:クラス 'horse'が見つかりませんが発生します

class cart extends horse {
    public function get_breed() { return "Wood"; }
}

abstract class horse extends animal {
    public function get_breed() { return "Jersey"; }
}

abstract class animal {
    public abstract function get_breed();
}

$cart = new cart();
print($cart->get_breed());
102
Dhairya Lakhera

抽象クラスは、プログラマーによって部分的にのみ実装されるクラスです。 1つ以上の抽象メソッドを含めることができます。抽象メソッドは、メソッドを子クラスに実装する必要があることをプログラマに伝えるのに役立つ単なる関数定義です。

ここの良い説明があります。

17
Sarfraz

抽象クラ​​ス
1。抽象メソッドが含まれています
2。直接初期化できません
3。抽象クラスのオブジェクトを作成できません
4。継承目的にのみ使用

抽象メソッド
1。ボディを含めることはできません
2。プライベートとして定義できません
3。子クラスは、抽象クラスで宣言されたメソッドを定義する必要があります

サンプルコード:

abstract class A {
    public function test1() {
        echo 'Hello World';
    }
    abstract protected function f1();
    abstract public function f2();
    protected function test2(){
        echo 'Hello World test';
    }
}

class B extends A {
    public $a = 'India';
    public function f1() {
        echo "F1 Method Call";
    }
    public function f2() {
        echo "F2 Method Call";
    }
}

$b = new B();
echo $b->test1() . "<br/>";
echo $b->a . "<br/>";
echo $b->test2() . "<br/>";
echo $b->f1() . "<br/>";
echo $b->f2() . "<br/>";

出力:

Hello World
India
Hello World test
F1 Method Call
F2 Method Call
10
vivek s vamja
  • 抽象クラスには、メソッドの署名の宣言のみが含まれ、実装を定義できません。
  • 抽象化クラスは、キーワードabstractを使用して定義されます。
  • 抽象クラスは、多重継承を実装できません。
  • PHP 5の最新バージョンでは、抽象クラスとメソッドが導入されています。
  • 抽象として定義されたクラス、オブジェクトを作成できません(インスタンス化されない場合があります)
6
Elangovan

抽象クラスは、保護された変数を含む変数を含む通常のクラスに似ています。コンストラクタを含む関数は、抽象メソッドを含む1つだけが異なります。

抽象メソッドは、定義のない空のメソッドを意味するため、抽象クラスの1つの違いのみが抽象クラスのオブジェクトを作成できません

抽象には抽象メソッドが含まれている必要があり、これらのメソッドはその継承クラスで定義されている必要があります。

0

抽象クラスは、直接初期化できないクラスです。または、他のWordでは、抽象クラスはオブジェクトを直接作成できないクラスであると言えます。 In PHP抽象クラスはキーワードabstractで定義されています。

また、少なくとも1つのクラス抽象になるには、クラスの1つのメソッドが抽象でなければなりません。

抽象クラスの詳細については、私のブログの PHPの抽象クラス を参照してください。

0