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

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

Dec 28, 2016 am 10:12 AM

クラスの役割
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 '我是final方法';
    }
}
class AmChild extends AmParent{
     public function end_func(){
        echo '我是子类,我想重写final方法,可是报错了';
    }
}
ログイン後にコピー
运行结果:报错
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( 'have implemented ',' abstract_func ');
ログイン後にコピー
运行结果,报错:
have implemented abstract_func
ログイン後にコピー

使用法の意味

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

<?php
abstract class Goods{
    abstract public function sayName();
}
 class Books extends  Goods{
     public function sayName(){
         echo '我是一本书的名字<br/>';
     }
}
 class Mobiles extends  Goods{
     public function sayName(){
         echo '我是一部手机的名字<br/>';
     }
}
$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 '我实现了接口方法';
     }
     public function sayPrice(){
         echo '我实现了接口方法';
     }
}
ログイン後にコピー

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

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('C'));
var_dump(class_exists('iA'));
ログイン後にコピー
rree
メソッド本体や抽象キーワードのないパブリック メソッドと定数が満載です。


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


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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

CakePHP の日付と時刻

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

CakePHP ファイルのアップロード

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

CakePHP ルーティング

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP について話し合う

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

CakePHP プロジェクトの構成

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP クイックガイド

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法

See all articles