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

回答編集履歴

4

見直し

2018/12/12 01:53

投稿

退会済みユーザー
answer CHANGED
@@ -77,7 +77,7 @@
77
77
 
78
78
  class foo {
79
79
  public const X = 1;
80
- public static $y = 2;
80
+ public static $y = 2; // staticがないとFatal error
81
81
  }
82
82
 
83
83
  class bar {

3

加筆修正

2018/12/12 01:53

投稿

退会済みユーザー
answer CHANGED
@@ -29,4 +29,67 @@
29
29
  もうちょっとわかりやすい記事を探してみた。
30
30
 
31
31
  [PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜 - maeharinの日記](http://maeharin.hatenablog.com/entry/20130202/php_late_static_bindings)
32
- [PHPの「$this」と「self::」の違い - Qiita](https://qiita.com/Otake_M/items/1349e761ce3f465c7f9f)
32
+ [PHPの「$this」と「self::」の違い - Qiita](https://qiita.com/Otake_M/items/1349e761ce3f465c7f9f)
33
+
34
+ ---
35
+
36
+ 検証コードを書きながら、
37
+ 親クラスからの継承の話と、
38
+ おなじ命名空間での他クラスからのアクセスの話も知っといたほうがいいと思えてきました。
39
+
40
+ 謎なコードを示します。
41
+
42
+ ```php
43
+ <?php
44
+
45
+ class foo {
46
+ public function hoge() { echo 'hoge'; }
47
+ public static function fuga() { echo 'fuga'; }
48
+ }
49
+
50
+ class bar {
51
+ public function piyo() {
52
+ echo foo::hoge();
53
+ }
54
+ }
55
+ $x = new bar();
56
+ $x->piyo();
57
+ ```
58
+
59
+ これ、実行すると、
60
+ 「Deprecated: Non-static method foo::hoge() should not be called statically」
61
+ ってエラーメッセージが出ますが、
62
+ 「hoge」って出力されます。
63
+
64
+ ```php
65
+ class bar {
66
+ public function piyo() {
67
+ echo foo::fuga();
68
+ }
69
+ }
70
+ ```
71
+ とすることでエラーメッセージなしに「fuga」って出力されます。
72
+ **クラスfooとbarの間には継承の関係はありません**。
73
+ 同じ命名空間にいるだけです。
74
+
75
+ ```php
76
+ <?php
77
+
78
+ class foo {
79
+ public const X = 1;
80
+ public static $y = 2;
81
+ }
82
+
83
+ class bar {
84
+ public function piyo() {
85
+ echo foo::X . PHP_EOL;
86
+ echo foo::$y . PHP_EOL;
87
+ }
88
+ }
89
+ $x = new bar();
90
+ $x->piyo();
91
+ ```
92
+ 結果は「1(改行)2(改行)」です。
93
+ クラスうんぬんいうまえに、スコープ演算子と命名空間のことも知っとかないと、
94
+ 危ういと思います。
95
+ (これが理解できると、フレームワークのソースコードも読めるようになるのかも。)

2

見直し

2018/12/12 01:52

投稿

退会済みユーザー
answer CHANGED
@@ -1,6 +1,8 @@
1
1
  > サブクラスから parent:: で親クラスのインスタンスメソッド、静的メソッドの両方にアクセスできます。
2
2
 
3
3
  違うなぁ。混乱しやすいのかもしれないけど。
4
+ インスタンス(動的プロパティ、動的メソッド)にアクセスするのはアロー演算子、
5
+ クラス(静的プロパティ、静的メソッド)にアクセスするのがダブルコロン。
4
6
 
5
7
  お約束のリファレンスより。
6
8
 

1

見直し

2018/12/11 10:44

投稿

退会済みユーザー
answer CHANGED
@@ -23,7 +23,7 @@
23
23
  > クラスを拡張するとき、サブクラスは親クラスから public と、protected のメソッドをすべてを引き継ぎます。
24
24
 
25
25
  すっごく時間をかけて説明文を書いてみたけど、
26
- 説明が危うい気がしたので、
26
+ 説明が危うく拙い気がしたので、消して、
27
27
  もうちょっとわかりやすい記事を探してみた。
28
28
 
29
29
  [PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜 - maeharinの日記](http://maeharin.hatenablog.com/entry/20130202/php_late_static_bindings)