ホームページ  >  記事  >  バックエンド開発  >  Trait を使用して PHP の単一継承の問題を解決する PHP の詳細な例

Trait を使用して PHP の単一継承の問題を解決する PHP の詳細な例

coldplay.xixi
coldplay.xixi転載
2020-06-09 11:59:462393ブラウズ

Trait を使用して PHP の単一継承の問題を解決する PHP の詳細な例

#PHP Trait を使って PHP の単一継承問題を解決する詳しい説明

この記事では主にPHP Trait を使用すると、PHP 単一継承の問題が解決されます。Trait を使用して PHP で PHP 単一継承を実装する際の関連操作スキルと注意事項が、サンプル形式で詳細に分析されています。必要な方は、次の

# を参照してください。

##この記事の例では、PHP での Trait の使用について説明します。PHP の単一継承の問題を解決します。参考までに皆さんと共有してください。詳細は次のとおりです。

継承とは何ですか?

継承は、実際にはオブジェクト指向プログラミングに存在する 2 つのクラス間の関係です。これはオブジェクト指向プログラミング手法の重要な手段です。継承により、プログラムをより効果的に編成できます。構造、明確化クラス間の関係を把握し、既存のクラスを活用することで、より複雑で踏み込んだ開発を実現します。

あるクラスが別のクラスのすべてのデータと操作を所有している場合、2 つのクラス間に継承関係があると言われます。

継承されたクラスを親クラスと呼び、親クラスのすべてのデータと操作を継承するクラスをサブクラスと呼びます。

PHP で extends を使用して、サブクラスと親クラスの間の継承関係を示します。

オブジェクト指向プログラミングでは、継承を使用して設計システム内のクラスを編成すると、プログラムの抽象化が向上し、人間の考え方に近づき、プログラム構造がより明確になり、コーディングとメンテナンスが軽減されます。 .仕事量。

単一継承とは、クラスに親クラスが 1 つだけあり、その構造が単純なツリー構造で表現できることを意味します。多重継承とは、クラスが複数の親クラスを持つことができ、その静的なデータを意味します。属性と操作はこれらすべての親クラスから継承され、その構造は複雑なメッシュ構造で表現される必要があります。

PHP は単一継承のみをサポートしますが、複数の継承はインターフェイスまたはトレイトを通じて実装されます。

#PHP での単一継承の例

// 单继承:一个子类只能有一个父类
class A{
  function show() {
    echo "A";
  }
}
 
class B{
  function show() {
    echo "B";
  }
}
 
class C extends A{
 
}
 
$c = new C;
$c->show();

Trait を使用して PHP での単一継承を解決する

Please PHP 5.4.0 以降、PHP は traits と呼ばれるコード再利用の方法を実装します。

Trait は、PHP のような単一継承言語用に用意されたコード再利用メカニズムです。Trait は、単一継承言語の制限を軽減し、開発者が異なる階層内の独立したクラスで自由に再利用できるように設計されています。 MethodTrait と Class の組み合わせは、複雑さを軽減し、トレイト自体ではインスタンス化できない従来の多重継承および Mixin クラスに関連する典型的な問題を回避する方法を定義します。

#例:

<?php
  trait Reader{
   public function add($var1,$var2){
     return $var1+$var2;
   }
  }
  trait writer {
   public function multiplication($var1,$var2){
     return $var1*$var2;
   }
  }
  class File {
   use Reader;
   use writer;
   public function calculate($var1,$var2){
     echo "Ressult of addition:".$this->add($var1,$var2) ."\n";
     echo "Ressult of multiplication:".$this->multiplication($var1,$var2);
   }
  }
  $o = new File();
  $o->calculate(5,3);

複数の特性

カンマで区切って、複数の特性を use ステートメントにリストし、それらはすべてクラスに挿入できます。

<?php
trait Hello {
  public function sayHello() {
    echo &#39;Hello &#39;;
  }
}
 
trait World {
  public function sayWorld() {
    echo &#39;World&#39;;
  }
}
 
class MyHelloWorld {
  use Hello, World;
  public function sayExclamationMark() {
    echo &#39;!&#39;;
  }
}
 
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();

競合の解決

2 つのトレイトが同じ名前のメソッドを挿入する場合、競合が明示的に解決されないと致命的なエラーが発生します。

同じクラス内の複数の特性の名前の競合を解決するには、 replaceof 演算子を使用して、競合するメソッドのどれを使用するかを明示的に指定する必要があります。

上記のメソッドでは、他のメソッドを除外することのみが可能ですが、as 演算子はメソッドのエイリアスを導入できます。 as 演算子はメソッドの名前を変更せず、そのメソッドにも影響を与えないことに注意してください。

例:

<?php
trait A {
  public function smallTalk() {
    echo &#39;a&#39;;
  }
  public function bigTalk() {
    echo &#39;A&#39;;
  }
}
 
trait B {
  public function smallTalk() {
    echo &#39;b&#39;;
  }
  public function bigTalk() {
    echo &#39;B&#39;;
  }
}
 
class Talker {
  use A, B {
    B::smallTalk insteadof A;
    A::bigTalk insteadof B;
  }
}
 
class Aliased_Talker {
  use A, B {
    B::smallTalk insteadof A;
    A::bigTalk insteadof B;
    B::bigTalk as talk;
  }
}

特性から特性を合成する

クラスが特性を使用できるのと同じように、他の特性も特性を使用できます。特性を定義するときに 1 つ以上の特性を使用すると、他の特性の一部またはすべてのメンバーを組み合わせることができます。

<?php
trait Hello {
  public function sayHello() {
    echo &#39;Hello &#39;;
  }
}
 
trait World {
  public function sayWorld() {
    echo &#39;World!&#39;;
  }
}
 
trait HelloWorld {
  use Hello, World;
}
 
class MyHelloWorld {
  use HelloWorld;
}
 
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();

特性の抽象メンバー

使用されるクラスに要件を強制するために、特性は抽象メソッドの使用をサポートします。

<?php
trait Hello {
  public function sayHelloWorld() {
    echo &#39;Hello&#39;.$this->getWorld();
  }
  abstract public function getWorld();
}
 
class MyHelloWorld {
  private $world;
  use Hello;
  public function getWorld() {
    return $this->world;
  }
  public function setWorld($val) {
    $this->world = $val;
  }
}

Trait の静的メンバー

Traits は静的メンバーと静的メソッドによって定義できます。

<?php<br>// 静态成员
trait Counter {
  public function inc() {
    static $c = 0;
    $c = $c + 1;
    echo "$c\n";
  }
}
 
class C1 {
  use Counter;
}
 
class C2 {
  use Counter;
}
 
$o = new C1(); $o->inc(); // echo 1
$p = new C2(); $p->inc(); // echo 1
<?php
// 静态方法
trait StaticExample {
  public static function doSomething() {
    return &#39;Doing something&#39;;
  }
}
 
class Example {
  use StaticExample;
}
 
Example::doSomething();
<?php
// 定义属性
trait PropertiesTrait {
  public $x = 1;
}
 
class PropertiesExample {
  use PropertiesTrait;
}
 
$example = new PropertiesExample;
$example->x;

推奨チュートリアル: 「

PHP ビデオ チュートリアル

以上がTrait を使用して PHP の単一継承の問題を解決する PHP の詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。