ホームページ >バックエンド開発 >PHPチュートリアル >PHP でのトレイトの使用方法についての詳細な図とテキストの説明

PHP でのトレイトの使用方法についての詳細な図とテキストの説明

墨辰丷
墨辰丷オリジナル
2018-05-22 14:18:321384ブラウズ

この記事では主にPHPでのトレイトの使い方について詳しく説明していますので、興味のある方は参考にしていただければ幸いです。簡単に言うと、 trait キーワードは、クラスが基本クラスの属性とメソッドを統合したいが、他の基本クラスのメソッドも持ちたいという問題を解決するために PHP で使用されます。また、trait キーワードは通常、使用。


<?php
  trait Drive {
    public $carName = &#39;trait&#39;;
    public function driving() {
      echo "driving {$this->carName}\n";
    }
  }
  class Person {
    public function eat() {
      echo "eat\n";
    }
  }
  class Student extends Person {
    use Drive;
    public function study() {
      echo "study\n";
    }
  }
  $student = new Student();
  $student->study();
  $student->eat();
  $student->driving();

?>


出力結果は以下の通りです。


study
eat
driving trait


上記の例では、Studentクラスがpersonを継承し、eatメソッドを持ち、Driveを組み合わせることで駆動メソッドを持ちます。および属性 carName。

Trait、基底クラス、このクラスに同名のプロパティやメソッドがあった場合、最終的にどちらが保持されるのでしょうか?


<?php 
  trait Drive {
    public function hello() {
      echo "hello drive\n";
    }
    public function driving() {
      echo "driving from drive\n";
    }
  }
  class Person {
    public function hello() {
      echo "hello person\n";
    }
    public function driving() {
      echo "driving from person\n";
    }
  }
  class Student extends Person {
    use Drive;
    public function hello() {
      echo "hello student\n";
    }
  }
  $student = new Student();
  $student->hello();
  $student->driving();
?>


出力結果は以下の通りです:


hello student
driving from drive


したがって、メソッドまたは属性が同じ名前を持つ場合、現在のクラスのメソッドがオーバーライドされるという結論になります。特性のメソッド、および特性のメソッドは基本クラスのメソッドをオーバーライドします。

複数のトレイトを結合する場合は、トレイト名をカンマで区切ります:


use Trait1, Trait2;


複数のトレイトに同じ名前のメソッドまたはプロパティが含まれている場合はどうなりますか?その答えは、結合された複数の特性に同じ名前のプロパティまたはメソッドが含まれている場合、競合を解決するにはそれらを明示的に宣言する必要がある、そうしないと致命的なエラーが発生するということです。


<?php
trait Trait1 {
  public function hello() {
    echo "Trait1::hello\n";
  }
  public function hi() {
    echo "Trait1::hi\n";
  }
}
trait Trait2 {
  public function hello() {
    echo "Trait2::hello\n";
  }
  public function hi() {
    echo "Trait2::hi\n";
  }
}
class Class1 {
  use Trait1, Trait2;
}
?>


出力結果は次のとおりです:


コードをコピーしますコードは次のとおりです:


PHP Fatal error: Traitメソッドhelloは適用されていません。 ~/php54/trait_3.php の 20 行目で Class1 の他の特性メソッドとの衝突


競合を解決するには、代わりに と を演算子として使用し、as はメソッドにエイリアスを与えます。具体的な使用法を参照してください。 コード:


<?php
trait Trait1 {
  public function hello() {
    echo "Trait1::hello\n";
  }
  public function hi() {
    echo "Trait1::hi\n";
  }
}
trait Trait2 {
  public function hello() {
    echo "Trait2::hello\n";
  }
  public function hi() {
    echo "Trait2::hi\n";
  }
}
class Class1 {
  use Trait1, Trait2 {
    Trait2::hello insteadof Trait1;
    Trait1::hi insteadof Trait2;
  }
}
class Class2 {
  use Trait1, Trait2 {
    Trait2::hello insteadof Trait1;
    Trait1::hi insteadof Trait2;
    Trait2::hi as hei;
    Trait1::hello as hehe;
  }
}
$Obj1 = new Class1();
$Obj1->hello();
$Obj1->hi();
echo "\n";
$Obj2 = new Class2();
$Obj2->hello();
$Obj2->hi();
$Obj2->hei();
$Obj2->hehe();
?>


出力結果は次のとおりです:


Trait2::hello
Trait1::hi

Trait2::hello
Trait1::hi
Trait2::hi
Trait1::hello


キーワードには別の用途があり、メソッドのアクセス制御を変更します。

Trait は Trait と組み合わせることもでき、Trait は抽象メソッド、静的プロパティ、静的メソッドをサポートします。 テスト コードは次のとおりです。


<?php
trait Hello {
  public function sayHello() {
    echo "Hello\n";
  }
}
trait World {
  use Hello;
  public function sayWorld() {
    echo "World\n";
  }
  abstract public function getWorld();
  public function inc() {
    static $c = 0;
    $c = $c + 1;
    echo "$c\n";
  }
  public static function doSomething() {
    echo "Doing something\n";
  }
}
class HelloWorld {
  use World;
  public function getWorld() {
    return &#39;get World&#39;;
  }
}
$Obj = new HelloWorld();
$Obj->sayHello();
$Obj->sayWorld();
echo $Obj->getWorld() . "\n";
HelloWorld::doSomething();
$Obj->inc();
$Obj->inc();
?>


出力結果は次のとおりです。


関連する推奨事項:


【phpクラスとオブジェクト】

trait

Traits属性とphpの基本的な使用法

Traitの使用に関する詳細なステップバイステップガイド


以上がPHP でのトレイトの使用方法についての詳細な図とテキストの説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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