回答編集履歴

3

追記

2017/08/15 02:50

投稿

masaya_ohashi
masaya_ohashi

スコア9206

test CHANGED
@@ -30,8 +30,64 @@
30
30
 
31
31
 
32
32
 
33
+
34
+
33
35
  $hoge = new Hoge();
34
36
 
35
37
  $hoge->proc(); // trait Fugaのprocが呼ばれ、Hogeのtextが参照されhogeと出力される。
36
38
 
37
39
  ```
40
+
41
+
42
+
43
+ # 追記
44
+
45
+ Hogeが別のクラスを継承していてもtraitは使えますが、メソッドやプロパティの名前の衝突等に気を使う必要があります(もちろん継承していようがいまいが衝突には注意する必要があります)。
46
+
47
+ ```PHP
48
+
49
+ trait Fuga {
50
+
51
+ function procA() {
52
+
53
+ echo $this->text;
54
+
55
+ }
56
+
57
+ }
58
+
59
+ class Piyo {
60
+
61
+ function procA() {
62
+
63
+ echo 'ここの処理はtraitに同名のメソッドがあるのでオーバーライドされる';
64
+
65
+ }
66
+
67
+ function procB() {
68
+
69
+ echo 'piyo piyo';
70
+
71
+ }
72
+
73
+ }
74
+
75
+ class Hoge extends Piyo {
76
+
77
+ use Fuga; // procAがオーバーライドされる
78
+
79
+ protected $text = 'hoge';
80
+
81
+ }
82
+
83
+
84
+
85
+
86
+
87
+ $hoge = new Hoge();
88
+
89
+ $hoge->procA(); // trait Fugaのprocが呼ばれ、Hogeのtextが参照されhogeと出力される。
90
+
91
+ $hoge->procB(); // procBはtraitの影響を受けず、piyo piyoと出力される。
92
+
93
+ ```

2

編集

2017/08/15 02:50

投稿

masaya_ohashi
masaya_ohashi

スコア9206

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

1

名称をHoge、Fugaに変更

2017/08/15 02:31

投稿

masaya_ohashi
masaya_ohashi

スコア9206

test CHANGED
@@ -2,23 +2,23 @@
2
2
 
3
3
 
4
4
 
5
- ```
5
+ ```PHP
6
6
 
7
- trait B {
7
+ trait Fuga {
8
8
 
9
9
  function proc() {
10
10
 
11
11
  // 処理
12
12
 
13
- echo $this->text;
13
+ echo $this->text; // このthisはtraitをuseしたインスタンスとなる
14
14
 
15
15
  }
16
16
 
17
17
  }
18
18
 
19
- class A {
19
+ class Hoge {
20
20
 
21
- use B;
21
+ use Fuga;
22
22
 
23
23
  protected $text = 'hoge';
24
24
 
@@ -26,8 +26,8 @@
26
26
 
27
27
 
28
28
 
29
- $a = new A();
29
+ $hoge = new Hoge();
30
30
 
31
- $a->proc(); // trait Bのprocが呼ばれ、Aのtextが参照されhogeと出力される。
31
+ $hoge->proc(); // trait Fugaのprocが呼ばれ、Hogeのtextが参照されhogeと出力される。
32
32
 
33
33
  ```