PHP における abstract、final、static の原理と使用法の詳細な説明

coldplay.xixi
リリース: 2023-04-09 08:08:01
転載
3731 人が閲覧しました

PHP における abstract、final、static の原理と使用法の詳細な説明

この記事の例では、PHP における abstract、final、static の原則と使用法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです。

abstract(abstract)

PHP 5 は、抽象クラスと抽象メソッドをサポートしています。抽象として定義されたクラスはインスタンス化できません。クラス内の少なくとも 1 つのメソッドが抽象宣言されている場合は、クラスを抽象宣言する必要があります。 abstract として定義されたメソッドは、その呼び出しメソッド (パラメーター) を宣言するだけであり、 はその特定の関数実装を定義できません。

#抽象クラスを継承する場合、サブクラスは親クラスのすべての抽象メソッドを定義する必要があります

; さらに、これらのメソッドのアクセス制御は、親クラスのアクセス制御と同じ (またはより緩和された) # である必要があります。たとえば、抽象メソッドが protected として宣言されている場合、サブクラスに実装されたメソッドは protected または public (厳密には private>protected>public) として宣言される必要がありますが、private として定義することはできません。さらに、 メソッドの呼び出し方法は一致する必要があります。つまり、必要なパラメータの型と数が一貫している必要があります。たとえば、サブクラスが親クラスの抽象メソッドの宣言に含まれていないオプションのパラメーターを定義している場合、2 つの宣言の間に競合はありません。これは、PHP 5.4 以降のコンストラクターにも当てはまります。 PHP 5.4 より前のコンストラクター宣言は異なる可能性があります。 #関連する学習に関する推奨事項: PHP プログラミングの入門から熟練度まで

#概要:

抽象クラスはインスタンス化できません;

クラス内に抽象メソッドがある場合、このクラスも抽象である必要があります;
  • 抽象クラス呼び出しメソッドとパラメータのみを宣言できますが、特定の関数実装を定義することはできません;
  • 抽象クラスを継承するサブクラスは、抽象クラスのすべての抽象メソッドを実装する必要があります;
  • サブクラスに実装された抽象メソッドのアクセス制御は、親クラスのアクセス制御よりも厳しくする必要があります;
  • 呼び出しメソッドとメソッドのパラメーターの数サブクラスに実装されるメソッドは、実装されるメソッドと同じである必要があり、一貫性があります。
  • 例:
  • <?php
    abstract class AbstractClass
    {
      // 强制要求子类定义这些方法,不定义功能实现
      abstract protected function getValue();
      abstract protected function prefixValue($prefix);
    
      // 普通方法(非抽象方法),子类可以不重写
      public function printOut() {
        print $this->getValue() . "\n";
      }
    }
    
    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";
      }
    }
    
    $class1 = new ConcreteClass1;
    $class1->printOut();
    echo $class1->prefixValue(&#39;FOO_&#39;) ."\n";
    
    $class2 = new ConcreteClass2;
    $class2->printOut();
    echo $class2->prefixValue(&#39;FOO_&#39;) ."\n";
    ?>
    ログイン後にコピー
    <?php
    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"), "\n";
    echo $class->prefixName("Pacwoman"), "\n";
    ?>
    ログイン後にコピー
  • final

  • 親クラスのメソッドがfinalと宣言されている場合、サブクラスはそのメソッドをオーバーライドできません。クラスがfinal宣言されている場合、そのクラスを継承することはできません。

これは理解しやすいため、詳細は説明しません

static

クラス属性またはメソッドを静的として宣言すると、クラスをインスタンス化せずに直接アクセスできるようになります。 。インスタンス化されたクラスのオブジェクトを介して静的プロパティにアクセスすることはできません (ただし、静的メソッドはアクセスできます)。

PHP 4 との互換性を保つために、アクセス制御が指定されていない場合、プロパティとメソッドはデフォルトで public になります。

静的メソッドではオブジェクトを呼び出す必要がないため、疑似変数

$this

は静的メソッドでは使用できません。

静的プロパティには、

->

演算子を使用してオブジェクトからアクセスできません。

非静的メソッドを静的に呼び出すと、 E_STRICT

レベルのエラーが発生します。

他のすべての PHP 静的変数と同様、静的プロパティは式ではなくリテラルまたは定数にのみ初期化できます。したがって、静的プロパティは整数または配列に初期化できますが、別の変数や関数の戻り値に初期化したり、オブジェクトを指すことはできません。

PHP 5.3.0 以降、変数を使用してクラスを動的に呼び出すことができます。ただし、この変数の値をキーワード self、parent、または static にすることはできません。

概要:

静的メソッドはインスタンス化する必要がなく、直接アクセスできます。

オブジェクトはインスタンス化されます。クラスは静的メソッドではクラスの静的プロパティにアクセスできませんが、静的メソッドにはアクセスできます。
  • 疑似変数
  • $this
  • は静的メソッドでは使用できません。

  • 静的プロパティには、-> 演算子を使用してオブジェクトからアクセスできません;

    非静的メソッドを静的に呼び出すと、
  • E_STRICT が発生します。
  • レベル エラー ;

  • 静的プロパティはリテラルまたは定数にのみ初期化できます。式 (変数/オブジェクトではなく関数の戻り値) は使用できません。

    変数を使用してクラスを動的に呼び出すことができます。ただし、この変数の値をキーワード self、parent、または static にすることはできません。
  • うわー

以上がPHP における abstract、final、static の原理と使用法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:jb51.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!