ホームページ > バックエンド開発 > PHPチュートリアル > PHPにおけるトレイトの基本的な使用例まとめ

PHPにおけるトレイトの基本的な使用例まとめ

伊谢尔伦
リリース: 2023-03-12 13:42:01
オリジナル
1463 人が閲覧しました

簡単に言うと、trait キーワードは、クラスが基本クラスの プロパティとメソッド を統合したいが、他の基本クラスのメソッドや trait も必要とするという問題を解決するために PHP で使用されます。通常は use とペアになっています。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<?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();

 

?>

ログイン後にコピー

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

1

2

3

study

eat

driving trait

ログイン後にコピー

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

<?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();

?>

ログイン後にコピー

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

1

2

hello student

driving from drive

ログイン後にコピー

したがって、メソッドまたは属性が同じ名前を持つ場合、現在のクラスのメソッドがトレイトのメソッドをオーバーライドし、トレイトのメソッドが今度はクラスのメソッドをオーバーライドすると結論付けられます。基本クラス。

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

1

use Trait1, Trait2;

ログイン後にコピー

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<?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;

}

?>

ログイン後にコピー

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

コードは次のとおりです:

1

PHP Fatal error:  Trait method hello has not been applied, because there are collisions with other trait methods on Class1 in ~/php54/trait_3.php on line 20

ログイン後にコピー

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

<a href="https://www.php.cn/wiki/996.html" target="_blank"><?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();

?></a>

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

1

2

3

4

5

6

7

Trait2::hello

Trait1::hi

 

Trait2::hello

Trait1::hi

Trait2::hi

Trait1::hello

ログイン後にコピー

as キーワードには別の用途があり、メソッドの

アクセス制御

を変更することです: Trait を Trait と組み合わせることもできます。 Trait は抽象メソッド、

static

属性、および Static メソッドをサポートしています。テストコードは次のとおりです:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

<a href="https://www.php.cn/wiki/188.html" target="_blank"><?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();

?></a>

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

1

2

3

4

5

6

Hello

World

get World

Doing something

1

2

ログイン後にコピー

以上がPHPにおけるトレイトの基本的な使用例まとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート