ホームページ  >  記事  >  バックエンド開発  >  PHP オブジェクト指向構文 5 最終クラス、抽象クラス、インターフェイス構造 (非クラス)

PHP オブジェクト指向構文 5 最終クラス、抽象クラス、インターフェイス構造 (非クラス)

黄舟
黄舟オリジナル
2016-12-28 10:12:321382ブラウズ

クラスの役割
1 オブジェクトをインスタンス化する
2 他のクラスの基底クラスとして継承される!
3 静的メンバーを呼び出します

2 つの主な関数: オブジェクトのインスタンス化と継承。

1 つの機能を持つ 2 つの特別なクラスがあります。
1、** はオブジェクトのインスタンス化のみが可能であり、継承することはできません。 **最終クラス
2 は継承のみが可能で、オブジェクトをインスタンス化できません。抽象クラス

最終クラスと最終メソッド
最終クラスは継承チェーンの最後のリンクであり、サブクラスを持つことはできません

final class End{
}
class Test  extends End{
}
运行结果:报错
PHP Fatal error: Class Test may not inherit from final class (End) in /usercode/file.php on line 7

finalメソッド、制限メソッドはサブクラスによってオーバーライドできません

<?php
class  AmParent{
    final public function end_func(){
        echo &#39;我是final方法&#39;;
    }
}
class AmChild extends AmParent{
     public function end_func(){
        echo &#39;我是子类,我想重写final方法,可是报错了&#39;;
    }
}
运行结果:报错
PHP Fatal error: Cannot override final method AmParentt::end_func() in /usercode/file.php on line 11

抽象クラス、抽象クラス
よりも優れています通常のクラス (クラス定数、静的プロパティ、静的メソッド、非静的プロパティ、非静的メソッド) もう 1 つ、抽象メソッドがあります。これは、抽象メソッドを実装するために非抽象サブクラスを必要とします。
抽象メソッド: {} がない場合、メソッドのみの宣言と呼ばれます。パラメータを持つことができます。

abstract public function abstract_func($arg1,$arg2)
//不能实例化对象
<?php
abstract class AmParent{
    abstract public function abstract_func($arg1,$arg2);
}
$amParent=new AmParent;
运行结果:
PHP Fatal error: Cannot instantiate abstract class AmParent in /usercode/file.php on line 5

継承できるのは 2 つの状況です:
1. サブクラスが抽象クラスである
2. サブクラスは抽象クラスではなく、親クラスのすべての抽象メソッド (およびメソッド本体 {}) を実装する必要があります。 )。

<?php
abstract class AmParent{
    abstract public function abstract_func($arg1,$arg2);
}
class AmChild extends AmParent{
}
运行结果,报错:
PHP Fatal error: Class AmChild contains 1 abstract method and must therefore be 
declared abstract or implement the remaining methods (AmParent::abstract_func) in /usercode/file.php on line 6

エラーは報告されません:

1 抽象クラスになるように抽象を追加します

<?php
abstract class AmParent{
    abstract public function abstract_func($arg1,$arg2);
}
abstract class AmChild extends AmParent{
}

2 抽象メソッドを実装します

<?php
abstract class AmParent{
    abstract public function abstract_func($arg1,$arg2);
}
 class AmChild extends AmParent{
     public function abstract_func($arg1,$arg2){
        echo $arg1.$arg2;
         }
}
$amChild=new AmChild;
$amChild->abstract_func( &#39;have implemented &#39;,&#39; abstract_func &#39;);
运行结果,报错:
have implemented abstract_func

使用法の意味

抽象クラスは、その非抽象サブクラスが同じ名前を持つメソッドを持つ必要があると規定していますが、メソッドは本体は異なる場合があります。

<?php
abstract class Goods{
    abstract public function sayName();
}
 class Books extends  Goods{
     public function sayName(){
         echo &#39;我是一本书的名字<br/>&#39;;
     }
}
 class Mobiles extends  Goods{
     public function sayName(){
         echo &#39;我是一部手机的名字<br/>&#39;;
     }
}
$book1=new Books;
$book1->sayName();
$mobile1=new Mobiles;
$mobile1->sayName();
运行结果:
我是一本书的名字
我是一部手机的名字

インターフェイス構造:

クラス (オブジェクト) が持つ必要があるパブリック メソッド (インターフェイス メソッド) を制限するために使用されます。

<?php
    interface iGoods{
        const PAI=3.14;
        public function sayName();
        public function sayPrice();
    }

インターフェイスには、パブリック抽象メソッド (不完全なメソッド) と定数のみを含めることができます。

implementsimplements
インターフェイス構造を実装するクラスには、インターフェイスで定義された抽象メソッドが含まれます。
2 つのオプション、1 抽象クラスとして定義する、2 インターフェイス メソッドを実装する!

//1定义成抽象类
abstract class Books implements iGoods{
    abstract  public function sayName();
    abstract  public function sayPrice();
}
//2实现接口方法
 class Books implements iGoods{
     public function sayName(){
         echo &#39;我实现了接口方法&#39;;
     }
     public function sayPrice(){
         echo &#39;我实现了接口方法&#39;;
     }
}

抽象クラスとインターフェースの違いを比較してください:

1 抽象クラスと通常のクラスの間には継承関係があります。
まず、共通クラスは抽象クラスの既存の通常のメンバーを取得できます。実装する必要がある 抽象メソッド (必ずしも public である必要はない)
2. インターフェースと通常のクラスの間には実装関係があります。
通常のクラスはインターフェイスを実装し、実装されていないパブリック メソッドのみを実装できます。
3. インターフェイスはパブリック メソッドと定数を定義するためにのみ使用されます。そして、抽象クラスは何でも持つことができます。
4. 複数のインターフェースの実装。クラスは同時に複数のインターフェイスを実装できます

<?php
interface iA{
        const PAI=3.14;
    public function sayA();
}
interface iB{
    public function sayB();
}
class C implements iA,iB{
    public function sayA(){
    }
    public function sayB(){
    }
}

ヒント:

インターフェイスはクラスではありません。インターフェイスは、クラスの構造を制限するために使用される独立した構造です。

//用class_exists(@param string),判断类是否存在
var_dump(class_exists(&#39;C&#39;));
var_dump(class_exists(&#39;iA&#39;));
rree
メソッド本体や抽象キーワードのないパブリック メソッドと定数が満載です。


上記は、PHP オブジェクト指向構文 5 の最終クラス、抽象クラス、インターフェイス構造 (クラスではありません) の内容です。その他の関連内容については、PHP 中国語 Web サイト (www.php.cn) を参照してください。 !


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。