質問するログイン新規登録

回答編集履歴

3

追記

2017/08/15 02:50

投稿

masaya_ohashi
masaya_ohashi

スコア9210

answer CHANGED
@@ -14,6 +14,34 @@
14
14
  protected $text = 'hoge';
15
15
  }
16
16
 
17
+
17
18
  $hoge = new Hoge();
18
19
  $hoge->proc(); // trait Fugaのprocが呼ばれ、Hogeのtextが参照されhogeと出力される。
20
+ ```
21
+
22
+ # 追記
23
+ Hogeが別のクラスを継承していてもtraitは使えますが、メソッドやプロパティの名前の衝突等に気を使う必要があります(もちろん継承していようがいまいが衝突には注意する必要があります)。
24
+ ```PHP
25
+ trait Fuga {
26
+ function procA() {
27
+ echo $this->text;
28
+ }
29
+ }
30
+ class Piyo {
31
+ function procA() {
32
+ echo 'ここの処理はtraitに同名のメソッドがあるのでオーバーライドされる';
33
+ }
34
+ function procB() {
35
+ echo 'piyo piyo';
36
+ }
37
+ }
38
+ class Hoge extends Piyo {
39
+ use Fuga; // procAがオーバーライドされる
40
+ protected $text = 'hoge';
41
+ }
42
+
43
+
44
+ $hoge = new Hoge();
45
+ $hoge->procA(); // trait Fugaのprocが呼ばれ、Hogeのtextが参照されhogeと出力される。
46
+ $hoge->procB(); // procBはtraitの影響を受けず、piyo piyoと出力される。
19
47
  ```

2

編集

2017/08/15 02:50

投稿

masaya_ohashi
masaya_ohashi

スコア9210

answer CHANGED
@@ -1,14 +1,16 @@
1
+ 多少Hogeに手を加えることになりますが、1行で済みます。
1
2
  traitを使いましょう。
2
3
 
4
+ [http://php.net/manual/ja/language.oop5.traits.php](http://php.net/manual/ja/language.oop5.traits.php)
5
+
3
6
  ```PHP
4
7
  trait Fuga {
5
8
  function proc() {
6
- // 処理
7
- echo $this->text; // このthisはtraitをuseしたインスタンスとなる
9
+ echo $this->text; // このthisはtraitをuseしたクラスのインスタンス(つまりHogeのインスタンス)となるので、textが参照可能
8
10
  }
9
11
  }
10
12
  class Hoge {
11
- use Fuga;
13
+ use Fuga; // trait Fugaの記述がこのクラスに埋め込まれる
12
14
  protected $text = 'hoge';
13
15
  }
14
16
 

1

名称をHoge、Fugaに変更

2017/08/15 02:31

投稿

masaya_ohashi
masaya_ohashi

スコア9210

answer CHANGED
@@ -1,17 +1,17 @@
1
1
  traitを使いましょう。
2
2
 
3
- ```
3
+ ```PHP
4
- trait B {
4
+ trait Fuga {
5
5
  function proc() {
6
6
  // 処理
7
- echo $this->text;
7
+ echo $this->text; // このthisはtraitをuseしたインスタンスとなる
8
8
  }
9
9
  }
10
- class A {
10
+ class Hoge {
11
- use B;
11
+ use Fuga;
12
12
  protected $text = 'hoge';
13
13
  }
14
14
 
15
- $a = new A();
15
+ $hoge = new Hoge();
16
- $a->proc(); // trait Bのprocが呼ばれ、Aのtextが参照されhogeと出力される。
16
+ $hoge->proc(); // trait Fugaのprocが呼ばれ、Hogeのtextが参照されhogeと出力される。
17
17
  ```