PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPの抽象クラスを説明します。


PHP5には、オブジェクト指向モデルが付属しています。オブジェクト指向モデルの概念には、クラス、オブジェクト、カプセル化、ポリモーフィズム、抽象クラスと最終クラス、メソッド、インターフェイス、継承などがあります。この記事では、

抽象クラスと、PHPのオブジェクト指向技術に関連する機能について説明します。また、いくつかの例とともに抽象クラスの実装について学習します。

しかし、深く掘り下げる前に、抽象クラスを定義する方法を学びましょう。

クラスの名前にabstractキーワードを付けることで、クラスをabstractとして宣言できます。定義は非常に明確で、抽象メソッドを含むクラスは抽象クラスと呼ばれます。抽象クラスで定義される抽象メソッドには、名前と引数だけがあり、他のコードはありません。

抽象クラスのオブジェクトは作成できません。むしろ、関数の定義を計算する子クラスを子クラスの抽象メソッドの本体に拡張し、これらの子クラスを利用してオブジェクトを作成する必要があります。

PHPの抽象クラスに関するいくつかの重要な事実について説明しましょう:

1.抽象クラスは、非抽象メソッドとともに抽象メソッドを持つことができます。

例:

<?php
   abstract class base {
      abstract function printdata();
      public function getdata() {
         echo "Tutorials Point";
      }
   }
   class child extends base{
      public function printdata(){
         echo "Good morning";
      }
   }
   $obj = new child();
   $obj->getdata();
?>

出力:

Tutorials Point

2。直接インスタンス化することはできません。

例:

<?php
   abstract class AbstractClass{
      abstract protected function calculate();
      public function adddata() {
         echo "Addition done";
      }
   }
   $obj=new AbstractClass();
   $obj->adddata();
?>

出力:

Fatal error: Uncaught Error: Cannot instantiate abstract class AbstractClass

3。同じ(または制限の少ない)可視性:

すべての子クラスは、親クラスで抽象としてマークされたすべてのメソッドを定義する必要があります。これらのメソッドはすべて、同じシグニチャーまたは制限の少ないシグニチャーで定義する必要があります。親クラスで保護された可視性を持つ抽象メソッドを定義する場合、子クラスの実行では、保護されたaorpublicで定義する必要がありますが、privateでは定義しないでください。

例:

<?php
   abstract class AbstractBaseClass1{
      abstract public function addValue();
      abstract protected function getValue();
   }
   class ConcreteClass extends AbstractBaseClass1{
      protected function addValue() {
         return "ConcreteClass";
      }
      public function getValue() {
         return " Child Class";
      }
   }
   $classobj = new ConcreteClass;
   $classobj->addValue();
?>

出力:

Fatal errorAccess level to ConcreteClass::addValue() must be public (as in class AbstractBaseClass1)

4.抽象メソッドに本文を含めることはできません:

抽象として宣言されたメソッドは、メソッドのシグネチャを宣言するだけです。メソッド内に誰も定義することはできません。身体は非抽象的方法の中に存在することができますが。

例:

<?php
   abstract class ParentClass{
      abstract protected function printValue(){
         return "Good morning";
      }
   }
   class ClassA extends ParentClass{
      protected function printValue() {
         return "ConcreteClass1";
      }
   }
   $classobj = new ClassA;
   $classobj->printValue();
?>

出力:

PHP Fatal error: Abstract function ParentClass::printValue() cannot contain body

5.少なくとも1つの抽象メソッドを含むクラスは、抽象クラスとして宣言する必要があります:

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

例:

<?php
   class AbstractClass {
      abstract protected function getValue();
      public function printData() {
         echo " Welcome to Tutorials Point";
      }
   }
   $obj=new AbstractClass();
   $obj->printData();
?>

出力:

PHP Fatal error: Class AbstractClass contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue)

6.抽象クラスは多重継承をサポートしていません:

多重継承はサポートしていません。

例:

<?php
   Abstract class SuperClass{
      public abstract function test();
      protected function welcome(){
         echo "Good morning";
      }
   }
   class ClassA extends SuperClass{
      public function test(){
         echo "Hello";
      }
      protected function welcome(){
         echo "Good afternoon";
      }
   }
   class ClassB extends SuperClass{
      public function test(){
         echo "Hello";
      }
      protected function welcome(){
         echo "Good evening";
      }
   }
   class ClassC extends ClassA, ClassB{
      public function test1(){
         $c = new self();
         $c->welcome();
      }
   }
?>

出力:

Error

説明:

ここでは、SuperClassをメソッドtest()とwelcome()を持つ抽象クラスとして宣言し、ClassAとClassB、および具象クラスは抽象クラスから拡張されています。次に、ClassAとClassBから拡張するClassCを作成しようとしました。コードから明らかなように、オブジェクトClassCを使用してメソッドwelcome()を呼び出すと、コンパイラはClassAのwelcome()メソッドとClassBのwelcome()メソッドのどちらを呼び出す必要があるかを選択できません。したがって、このような複雑さを回避するために、PHPは多重継承をサポートしていません。

注:

抽象クラスは別の抽象クラスを拡張でき、抽象クラスはインターフェースの実装を提供できます。


  1. PHPのget_class_methods()関数

    get_class_methods()関数は、クラスメソッドの名前を取得します。 name_of_classで指定されたクラスに定義されたメソッド名の配列を返します。エラーの場合、NULLを返します。 構文 get_class_methods(class) パラメータ name_of_class −クラス名。必須です! 戻る get_class_methods()関数は、name_of_classで指定されたクラスに対して定義されたメソッド名の配列を返します。エラーの場合、NULLを返します。 例 以下は例です- <?php class Demo {   &n

  2. Javaの抽象クラス

    宣言にabstractキーワードを含むクラスは、abstractクラスと呼ばれます。 抽象クラスには、抽象メソッド、つまり本体のないメソッドが含まれる場合と含まれない場合があります(public void get();) ただし、クラスに少なくとも1つの抽象メソッドがある場合、そのクラスは抽象として宣言する必要があります。 クラスが抽象として宣言されている場合、インスタンス化することはできません。 抽象クラスを使用するには、それを別のクラスから継承し、そのクラスに抽象メソッドの実装を提供する必要があります。 抽象クラスを継承する場合は、その中のすべての抽象メソッドに実装を提供する必要がありま