ホームページ >バックエンド開発 >PHPチュートリアル >息を震わせながら繰り返す、いつになったら立ち上がれるのか?
クラスの一部のメンバーを他のクラスが使用するにはどうすればよいでしょうか?継承を使用すると、継承チェーンが長すぎるため、便宜上、PHP にはコード再利用テクノロジ特性が提供されます。
1. 定義 : Trait
は、PHP と同様の 単一継承言語
用に用意されたコード再利用機構です。トレイトにより、 単一継承言語は、再利用のために継承しなければならないという恥ずかしい状況を
取り除くことができ、 オブジェクト指向
をより純粋なものにすることができます。
2. 基本構文:
Trait は class
に似たキーワードです。
<?php trait Eat{ public $a=10; //trait内允许有类的成员属性(包括静态属性),成员方法(包括静态方法) public static $b=666; //const c=3.14; //trait内不允许有常量 protected $e; //允许定义,但是实际不用 private $f; public function getA() { echo $this->a,"<br>"; } public static function getB() { echo self::$b,"<br>"; } } ?>
trait
はコードの再利用を実現するために使用され、インスタンス化または継承することはできません (まったくクラスではないため)。
<?php trait Eat{} // $a=new Eat;//报错 //calss A extends Eat{}//报错 ?>
3. 特性の使用
特性は単なるコードのコレクションであり、use
を使用して参照する必要があります。
<?php trait Eat{ public $a=10; public static $b=666; //const c=3.14; public function getA() { echo $this->a,"<br>"; } public static function getB() { echo self::$b,"<br>"; } } class A{ use Eat; public function getC() { echo $this->a,"<br>"; } } $boy=new A(); $boy->getC(); $boy->getA(); $boy->getB(); ?>
クラスは複数の特性を使用できます。
<?php trait A1{ } trait A2{ } class People{ use A1,A2; } ?>
4. トレイトの使用に関する問題
a. 同時に導入された複数のトレイトに同じ名前の属性がある場合、競合が発生します。起こる。
<?php trait A1{ public $a=11; } trait A2{ public $a=22; } class A3{ use A1,A2;//不允许同名属性 public function geta(){ echo $this->a; } } $example=new A3(); ?>
b. 同時に導入した複数のトレイトに同名のメソッドが存在すると競合が発生しますが、解決策としては A3 と A4 の 2 つがあります。
<?php trait A1{ public $a=11; public function eat(){ echo "A1中eat()方法","<br>"; } } trait A2{ public $b=22; public function eat(){ echo "A2中eat()方法","<br>"; } } class A3{ use A1,A2{ A1::eat insteadOf A2; //A1中的eat替代A2中的eat } } class A4{ use A1,A2{ A1::eat insteadOf A2;//A1中的eat替代A2中的eat A2::eat as eat2; //A2中的eat取别名eat2 } } $example=new A3(); $example->eat(); $example=new A4(); $example->eat2(); ?>
c. 同名カバレッジの問題: クラス内に導入されたトレイトと同じ名前のメンバーが存在する場合、別の方法で処理されます:
属性: 重複した名前は許可されません。つまり、クラス トレイト内と同じ名前のメンバー プロパティを定義することはできません (静的プロパティも同様です)。
メソッド: クラスオーバーライド特性。
d. 継承範囲の問題: クラスが trait
を使用する場合、そのクラスは親クラスからも継承し、そのトレイトにはそのクラスと同じ名前のメソッドがあります。親クラスの場合、trait
は親クラスと同じ名前のメソッドを上書きします。親クラスのメソッドにアクセスしたい場合は、同じ名前の trait メソッドを使用して、親クラスの同じ名前のメソッドにアクセスします。 <pre class="brush:php;toolbar:false"><?php
trait Eat{
public function eat(){
echo &#39;Eat::eat&#39;;
}
}
class Human{
public function eat(){
echo &#39;Human::eat&#39;;
}
}
//子类继承父类同时使用trait
class Man extends Human{
use Eat;
}
$m = new Man();
$m->eat();
?></pre>
e.trait 自体にはアクセスできません。他のクラスにコードを再利用するためにのみ使用されます。したがって、クラスは、特性を使用するときに、より高度なアクセス制御を使用できます: in
Afterつまり、ターゲットのアクセス修飾子修飾子を使用します。 <pre class="brush:php;toolbar:false"><?php
trait Eat{
private function show(){
echo &#39;eat&#39;;
}
}
class Human{
use Eat{
show as public eshow;
//注意:as是用来设定别名的,虽然没有同名show,但是系统认为show已经存在,所以必须别名,权限的更改的方法不是
//本尊
}
}
$h = new Human();
$h->eshow(); //eat
?></pre>
f.trait では
を使用できます。使用するクラスは、対応する abstract メソッド
を実装する必要があります。 using クラスは、抽象クラス、または抽象クラスのいずれかである必要があります。または、抽象メソッドを実装する必要があります。 <pre class="brush:php;toolbar:false"><?php
trait Eat{
public function eat(); //抽象方法
}
abstract class Human{
use Eat; //抽象类:可以不实现抽象方法
}
class Animal{
use Eat;
public function eat(){ //具体类:实现抽象方法
echo &#39;Animal::eat&#39;;
}
}
?></pre>
推奨:
以上が息を震わせながら繰り返す、いつになったら立ち上がれるのか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。