回答編集履歴

4

見直し

2018/12/12 01:53

投稿

退会済みユーザー
test CHANGED
@@ -156,7 +156,7 @@
156
156
 
157
157
  public const X = 1;
158
158
 
159
- public static $y = 2;
159
+ public static $y = 2; // staticがないとFatal error
160
160
 
161
161
  }
162
162
 

3

加筆修正

2018/12/12 01:53

投稿

退会済みユーザー
test CHANGED
@@ -61,3 +61,129 @@
61
61
  [PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜 - maeharinの日記](http://maeharin.hatenablog.com/entry/20130202/php_late_static_bindings)
62
62
 
63
63
  [PHPの「$this」と「self::」の違い - Qiita](https://qiita.com/Otake_M/items/1349e761ce3f465c7f9f)
64
+
65
+
66
+
67
+ ---
68
+
69
+
70
+
71
+ 検証コードを書きながら、
72
+
73
+ 親クラスからの継承の話と、
74
+
75
+ おなじ命名空間での他クラスからのアクセスの話も知っといたほうがいいと思えてきました。
76
+
77
+
78
+
79
+ 謎なコードを示します。
80
+
81
+
82
+
83
+ ```php
84
+
85
+ <?php
86
+
87
+
88
+
89
+ class foo {
90
+
91
+ public function hoge() { echo 'hoge'; }
92
+
93
+ public static function fuga() { echo 'fuga'; }
94
+
95
+ }
96
+
97
+
98
+
99
+ class bar {
100
+
101
+ public function piyo() {
102
+
103
+ echo foo::hoge();
104
+
105
+ }
106
+
107
+ }
108
+
109
+ $x = new bar();
110
+
111
+ $x->piyo();
112
+
113
+ ```
114
+
115
+
116
+
117
+ これ、実行すると、
118
+
119
+ 「Deprecated: Non-static method foo::hoge() should not be called statically」
120
+
121
+ ってエラーメッセージが出ますが、
122
+
123
+ 「hoge」って出力されます。
124
+
125
+
126
+
127
+ ```php
128
+
129
+ class bar {
130
+
131
+ public function piyo() {
132
+
133
+ echo foo::fuga();
134
+
135
+ }
136
+
137
+ }
138
+
139
+ ```
140
+
141
+ とすることでエラーメッセージなしに「fuga」って出力されます。
142
+
143
+ **クラスfooとbarの間には継承の関係はありません**。
144
+
145
+ 同じ命名空間にいるだけです。
146
+
147
+
148
+
149
+ ```php
150
+
151
+ <?php
152
+
153
+
154
+
155
+ class foo {
156
+
157
+ public const X = 1;
158
+
159
+ public static $y = 2;
160
+
161
+ }
162
+
163
+
164
+
165
+ class bar {
166
+
167
+ public function piyo() {
168
+
169
+ echo foo::X . PHP_EOL;
170
+
171
+ echo foo::$y . PHP_EOL;
172
+
173
+ }
174
+
175
+ }
176
+
177
+ $x = new bar();
178
+
179
+ $x->piyo();
180
+
181
+ ```
182
+
183
+ 結果は「1(改行)2(改行)」です。
184
+
185
+ クラスうんぬんいうまえに、スコープ演算子と命名空間のことも知っとかないと、
186
+
187
+ 危ういと思います。
188
+
189
+ (これが理解できると、フレームワークのソースコードも読めるようになるのかも。)

2

見直し

2018/12/12 01:52

投稿

退会済みユーザー
test CHANGED
@@ -3,6 +3,10 @@
3
3
 
4
4
 
5
5
  違うなぁ。混乱しやすいのかもしれないけど。
6
+
7
+ インスタンス(動的プロパティ、動的メソッド)にアクセスするのはアロー演算子、
8
+
9
+ クラス(静的プロパティ、静的メソッド)にアクセスするのがダブルコロン。
6
10
 
7
11
 
8
12
 

1

見直し

2018/12/11 10:44

投稿

退会済みユーザー
test CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
  すっごく時間をかけて説明文を書いてみたけど、
50
50
 
51
- 説明が危うい気がしたので、
51
+ 説明が危うく拙い気がしたので、消して、
52
52
 
53
53
  もうちょっとわかりやすい記事を探してみた。
54
54