ホームページ  >  記事  >  バックエンド開発  >  PHPでのimplementsの使用例を詳しく解説

PHPでのimplementsの使用例を詳しく解説

巴扎黑
巴扎黑オリジナル
2017-08-08 13:44:582108ブラウズ

PHP クラスのインターフェイスのアプリケーション キーワードはインターフェイスと実装です。インターフェイスは、そのメンバー属性がすべて抽象または定数である特別な抽象クラスであり、主にクラス名、クラスが所有するメソッド、および渡されるパラメーターを制限します。抽象抽象クラスに似た仕様で動作します

PHP クラスのインターフェイスのアプリケーション キーワードはインターフェイスと実装です。インターフェイスは、そのメンバー属性がすべて抽象または定数である特別な抽象クラスで、主にクラス名を指します。メソッドとそれが渡すパラメータは、抽象クラスに似た制約と仕様として機能します。

クラスへのインターフェースの適用

1. キーワード: インターフェース

2. インターフェースの導入と作成

インターフェース: メンバー属性はすべて抽象であるか、特別な抽象です定数のクラス。

ルール:

1. クラス内のすべてのメソッドは抽象です。

2. 抽象メソッドには抽象を追加する必要はありません。

3. インターフェースの抽象メソッド属性は public です。

4. メンバー属性は定数である必要があります。

フォーマットコードは次のとおりです:

interface demo { 
const NAME = "常量对象属性"; 
function myfun1(); //抽象方法
function myfun2(); //抽象方法,不用具体写入逻辑 
}


1. インターフェースの定義と呼び出し

<?php
interface Cinema
{
  const film = &#39;加勒比海盗&#39;;
  public function show();
}
class Order implements Cinema
{
  public function show()
  {
    echo "影院 接口开放了<br>";
  }
}
$face = new Order();
echo $face->show();    
echo Cinema::film;

注: 上記の例では、インターフェースのメソッド名に注意してください。は show であり、インターフェイスを継承するクラスはこのメソッドを show する必要があります。そうでない場合は、エラーが報告されます。言い換えれば、インターフェイスのメソッドは偽物であり、実際に機能するのは継承されたクラスのメソッドです。ここでのインターフェイスは PHP の抽象クラスに少し似ていますか?


第二に、パラメーターの制約が厳しいです

<?php
interface Cinema
{
  public function show(Order $show,$num);
}
// 显示正常
class Order implements Cinema
{
  public $number=&#39;0011排&#39;;
  public function show(Order $show,$num)
  {
    echo $show->number.$num;
  }
}
$face= new Order();
$face->show(new Order,$num=&#39;3人&#39;);//输出 0011排3人

注: 上記の例はインターフェイス クラスを継承します。インターフェイス メソッドを呼び出す場合、渡されるパラメーターはインターフェイス内のパラメーター名と一致している必要があります。それ以外の場合は、エラーが報告されます。

3. インターフェイスの呼び出しによるインターフェイス間の継承とパラメーターの受け渡し

<?php
interface Cinema
{
  public function show();
}
interface Cinema1 extends Cinema
{
  public function show1(Order1 $object,$num);
}
class Order implements Cinema1
{
  public function show()
  {
    echo "准备就绪<br>";
  }
  public function show1(Order1 $object,$num)
  {
    //var_dump($object);
    echo $object->number."$num<br>";
  }
}
class Order1
{
  public $number="0012排";
  function fun(){
    echo &#39; =================&#39;;
  }
}
$show = new Order1;
$show->fun();     
$test = new Order();
$test->show();      
$test->show1($show,$num=&#39;6人&#39;);
// 输出 ===============准备就绪0012排6人

説明: 上記の例から、インターフェイス Cinema1 がインターフェイス Cinemal を継承し、クラス Order がインターフェイス Cinema1 を継承していることがわかります。 Order クラスに 2 つのメソッドが含まれていることに気づいたかどうかはわかりませんが、1 つは show で、もう 1 つは show1 です。どちらかが欠けていると、致命的なエラーが報告されます。 show1(Order1 $object,$num) の Order1 は、クラス Order1 と同じルート継承クラス名を持つ必要があります。それらが異なる場合、致命的なエラーが報告されます。では、インターフェイスが複数のクラスに継承されており、クラス名が異なる場合はどうすればよいでしょうか?次に、後述する self を使用する必要があります

4 つ、1 つのインターフェイスには多重継承があります

<?php
interface demo {
  const NAME = "电影名称";
  function fun1();
  function fun2();
}
interface demo2 {
  function fun3();
  function fun4();
}
interface demo3 {
  const TEST = "这里是测试Test";
  function fun5();
}
class MyDemo implements demo, demo2 {
  function fun1() {
    echo "你好";
  }
  function fun2() {
    echo "----------";
  }
  function fun3() {
    echo "我也好<br />";
  }
  function fun4() {
    echo "大家都好<br />";
  }
}
class YourDemo extends MyDemo implements demo3 {
  function fun5() {
    echo "继承类后引用接口";
  }
}
$p = new YourDemo;
$p->fun1();
$p->fun2();
$p->fun3();
$p->fun4();
$p->fun5();

上記の出力です

こんにちは----------私もです

全員 大丈夫です

クラスを継承してインターフェイスを参照します

上の例では、インターフェイスがキーワード インターフェイスを使用して定義されており、キーワード インプリメンテーションがインターフェイス内のメソッドを実装するために使用されていることがわかります。

<?php
//定义接口
interface User{
  function getDiscount();
  function getUserType();
}

class VipUser implements User{ //VIP用户 接口实现
  private $discount = 0.8;  // VIP 用户折扣系数
  function getDiscount() {
    return $this->discount;
  }
  function getUserType() {
    return "VIP用户";
  }
}
class Goods{
  var $price = 88;
  var $vc;
  function run(User $vc){   //定义 User 接口类型参数,这时并不知道是什么用户
    $this->vc = $vc;
    $discount = $this->vc->getDiscount();
    $usertype = $this->vc->getUserType();
    echo $usertype."商品价格:".$this->price*$discount;
  }
}
$display = new Goods();
$display ->run(new VipUser); //VIP用户商品价格:70.4

この例は、PHP インターフェイスの簡単なアプリケーションを示しています。この例では、ユーザー インターフェイスはユーザーの割引を実装し、VipUser クラスは特定の割引係数を実装します。最後に、製品カテゴリ「Goods」は、ユーザー インターフェイスに基づいてさまざまなユーザー引用を実装します

最後に要約します:

抽象クラスとインターフェイスの違い

インターフェイスは特別な抽象クラスとみなすこともできます。モデルの仕様として。インターフェイスと抽象クラスの一般的な違いは次のとおりです。

1. サブクラスがインターフェイスを実装する場合、必要かどうかに関係なく、インターフェイス内のすべてのメソッドを実装する必要があります。必要なメソッドを実装します。

2. インターフェイスで定義されたメソッド名が変更された場合、このインターフェイスを実装するすべてのサブクラスはメソッド名を同期的に更新する必要があり、抽象クラスのメソッド名が変更された場合、そのサブクラスの対応するメソッド名は変更されません。影響を受けます。(古いメソッドの実装と比較して) 新しいメソッドになるだけです。

3. 抽象クラスは 1 つだけ継承できます。サブクラスが複数の親クラスから継承する必要がある関数を実装する必要がある場合は、インターフェイスを使用する必要があります。

以上がPHPでのimplementsの使用例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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