1.$this
インスタンス自身を指したいときに$thisを使うというのは、
そもそもclassのなかの変数にアクセスするという意味で、クラス自身を指すのではないかと
思って納得できません。
そもそも、変数には、メソッド内や関数内で使えるローカル変数と、
クラスに所属するメンバー変数と、
名前空間(namespace)に属する変数と、
グローバル変数があります。
php
1// 初学者が書きがちなコード例1
2<?php
3
4class Foo {
5 public $val;
6
7 public function bar() {
8 return $val;
9 }
10}
11
12$a = new Foo();
13echo $a->bar() . PHP_EOL;
これを実行すると、「Notice: Undefined variable: val 」が発生します。
public $val;
はclass Fooに属するメンバー変数$val
ですが、
class Fooに属するメソッドbar()の実装でreturn $val;
と書いてしまうと、
メソッド内ローカル変数の意味で$valを参照しに行って、そんなものは定義されていない、ということです。
メソッドに属するメンバー変数を確実にアクセスするために、$this
があります。
php
1// エラーなく動く例1
2<?php
3
4class Foo {
5 public $val;
6
7 public function bar() {
8 return $this->val;
9 }
10}
11
12$a = new Foo();
13echo $a->bar() . PHP_EOL;
とするとエラーなく実行できます。(値を$valに入れていないから、実行しても何も表示しないけどね。)
また、(混乱しやすいけど)このコードも実行できて、結果は0(改行)0(改行)となります。
-1なんて表示されません。
php
1<?php
2
3class Foo {
4 public $val = 0;
5
6 public function bar() {
7 return $this->val;
8 }
9
10 public function baz() {
11 $val = -1; // ローカル変数$valに代入しているだけで、メンバー変数に介入していないことに注意。
12 }
13}
14
15$a = new Foo();
16echo $a->bar() . PHP_EOL;
17$a->baz();
18echo $a->bar() . PHP_EOL;
2.super();
super();の呼び出しは。子クラスに継承するときにしか使われないという
理解で大丈夫ですか?
親クラスを呼び出すことで、親クラスのメソッドやプロパティをつかえるようにしているのですか?
んー、子クラス内メソッドから、親クラス内メソッドを呼び出す話?
super()なんてあったかなぁ、他の言語の関数などを不用意に持ち出すと混乱するよ、注意してね。
子クラスを定義するときに、特に実装を書かなければ、
親クラスが持つメンバー変数やプロパティやメソッドを使えます。
ただし、アクセス権が設定されていて、子クラスで使えたり使えなかったりします。
PHP: アクセス権 - Manual
PHPのアクセス修飾子public, protected, privateの違い | UX MILK
で、わざわざparent::~();
なんて書いて親クラスのメソッドを呼び出せるようにしているのは、
子クラスで同名メソッドを定義し直すと、定義し直したコトしか実行しないので、
ほんのちょっと挙動を変えたいだけで同じコードをまた書き直すのを省きたいとか、
親クラスで変更を加えた場合それを子クラスにも継承したいとか、
いくつかの理由があるんだろうな。と察する。
3.__construct() とstaticで定義するのは、
のコード例を示されても、
メンバー変数とローカル変数を混同しているコードでは意味がわかりませんよ。
__construct()
は、newでインスタンスが生成されるときに自動的に呼び出されるメソッド、コンストラクタです。
PHP: コンストラクタとデストラクタ - Manual
staticをつけたメソッドは、クラスのインスタンスを生成しなくても呼べるという特徴があります。
PHP: static キーワード - Manual
もう一度情報を整理してください。