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

回答編集履歴

4

訂正

2020/02/28 09:21

投稿

退会済みユーザー
answer CHANGED
@@ -5,7 +5,7 @@
5
5
  > そもそもclassのなかの変数にアクセスするという意味で、クラス自身を指すのではないかと
6
6
  思って納得できません。
7
7
 
8
- そもそも、変数には、メソッド内や関数内やブロック内で使えるローカル変数と、
8
+ そもそも、変数には、メソッド内や関数内で使えるローカル変数と、
9
9
  クラスに所属するメンバー変数と、
10
10
  名前空間(namespace)に属する変数と、
11
11
  グローバル変数があります。

3

見直し

2020/02/28 09:21

投稿

退会済みユーザー
answer CHANGED
@@ -49,6 +49,30 @@
49
49
  ```
50
50
  とするとエラーなく実行できます。(値を$valに入れていないから、実行しても何も表示しないけどね。)
51
51
 
52
+ また、(混乱しやすいけど)このコードも実行できて、結果は0(改行)0(改行)となります。
53
+ -1なんて表示されません。
54
+
55
+ ```php
56
+ <?php
57
+
58
+ class Foo {
59
+ public $val = 0;
60
+
61
+ public function bar() {
62
+ return $this->val;
63
+ }
64
+
65
+ public function baz() {
66
+ $val = -1; // ローカル変数$valに代入しているだけで、メンバー変数に介入していないことに注意。
67
+ }
68
+ }
69
+
70
+ $a = new Foo();
71
+ echo $a->bar() . PHP_EOL;
72
+ $a->baz();
73
+ echo $a->bar() . PHP_EOL;
74
+ ```
75
+
52
76
  ---
53
77
 
54
78
  > 2.super();

2

見直し

2020/02/28 09:07

投稿

退会済みユーザー
answer CHANGED
@@ -65,4 +65,23 @@
65
65
  [PHP: アクセス権 - Manual](https://www.php.net/manual/ja/language.oop5.visibility.php)
66
66
  [PHPのアクセス修飾子public, protected, privateの違い | UX MILK](https://uxmilk.jp/26435)
67
67
 
68
+ で、わざわざ`parent::~();`なんて書いて親クラスのメソッドを呼び出せるようにしているのは、
69
+ 子クラスで同名メソッドを定義し直すと、定義し直したコトしか実行しないので、
70
+ ほんのちょっと挙動を変えたいだけで同じコードをまた書き直すのを省きたいとか、
71
+ 親クラスで変更を加えた場合それを子クラスにも継承したいとか、
72
+ いくつかの理由があるんだろうな。と察する。
73
+
68
- ---
74
+ ---
75
+
76
+ > 3.__construct() とstaticで定義するのは、
77
+
78
+ のコード例を示されても、
79
+ メンバー変数とローカル変数を混同しているコードでは意味がわかりませんよ。
80
+
81
+ `__construct()`は、newでインスタンスが生成されるときに自動的に呼び出されるメソッド、コンストラクタです。
82
+ [PHP: コンストラクタとデストラクタ - Manual](https://www.php.net/manual/ja/language.oop5.decon.php)
83
+
84
+ staticをつけたメソッドは、クラスのインスタンスを生成しなくても呼べるという特徴があります。
85
+ [PHP: static キーワード - Manual](https://www.php.net/manual/ja/language.oop5.static.php)
86
+
87
+ もう一度情報を整理してください。

1

加筆修正

2020/02/28 09:02

投稿

退会済みユーザー
answer CHANGED
@@ -47,4 +47,22 @@
47
47
  $a = new Foo();
48
48
  echo $a->bar() . PHP_EOL;
49
49
  ```
50
- とするとエラーなく実行できます。(値を$valに入れていないから、実行しても何も表示しないけどね。)
50
+ とするとエラーなく実行できます。(値を$valに入れていないから、実行しても何も表示しないけどね。)
51
+
52
+ ---
53
+
54
+ > 2.super();
55
+ > super();の呼び出しは。子クラスに継承するときにしか使われないという
56
+ > 理解で大丈夫ですか?
57
+ > 親クラスを呼び出すことで、親クラスのメソッドやプロパティをつかえるようにしているのですか?
58
+
59
+ んー、子クラス内メソッドから、親クラス内メソッドを呼び出す話?
60
+ super()なんてあったかなぁ、他の言語の関数などを不用意に持ち出すと混乱するよ、注意してね。
61
+
62
+ 子クラスを定義するときに、特に実装を書かなければ、
63
+ 親クラスが持つメンバー変数やプロパティやメソッドを使えます。
64
+ ただし、アクセス権が設定されていて、子クラスで使えたり使えなかったりします。
65
+ [PHP: アクセス権 - Manual](https://www.php.net/manual/ja/language.oop5.visibility.php)
66
+ [PHPのアクセス修飾子public, protected, privateの違い | UX MILK](https://uxmilk.jp/26435)
67
+
68
+ ---