オブジェクト指向とは
細かい話は先人が山ほど解説しているのでここでは、
プログラムを「オブジェクト」と呼ばれる細かいパーツに分けて組み立てていくよ、という考え方とだけ。
$this を付け忘れてエラーが多発
学び始めてからすぐに、$thisというものに悩まされました。コードを書いていると、よくエラーが出てしまい、原因を探してみるとどうやら$thisを付け忘れていたのが原因でした。
よく陥った悪い例
最初こんな感じでコードを書いていました。
class OmochaBox {
private $omochas = [];
public function addOmocha($omochaname) {
// おもちゃを追加するメソッド
$omochas[] = $omochaname; // これが間違い
}
}
これだとエラーが出るか、もしくは欲しい実行結果にならないか。
正しいコード
class OmochaBox {
private $omochas = [];
public function addOmocha($omochaname) {
// 正しくは $this を使う!
$this->omochas[] = $omochaname;
}
}
$this を使わないと、クラスのプロパティにアクセスできないんですよね。この $this が「今このオブジェクト自身」を指していて、$this->omochas[] って書かないと $omochas はどこの配列かわからなくなっちゃうみたいです。
特に今回自分が作っていたものはインスタンスが一つしかない場合が殆どで、作っている側の目線だと「一つしかないんだからこれに決まってるじゃん」なんですが、
そんなこと言語側はちゃんと指定してもらわないとわからんよ、ということらしい。
$this を付け忘れていた理由
- 変数みたいに扱っていた
最初、クラスの中で定義した変数は自動的に使えると思っていたんです。だから、わざわざ $this を書かなくても、プロパティにアクセスできるんじゃないかって思ってました。 - 変数とプロパティの違いを意識していなかった
普通に変数を書いている感覚で$omochas[]ってやっちゃってました。でも、クラスの中のプロパティは外部の変数とは違って、ちゃんと$thisを付けて
「そこの!」クラスのプロパティだと指をさして教えてあげないといけない。そこが自分の頭の中で上手に解釈できていなかったのが今回のエラー祭りの原因かなと。
学んだこと
-
$thisは、そのクラスのインスタンスを指す。 - クラス内で定義されたプロパティにアクセスするときは、必ず
$this->プロパティ名でアクセスする必要がある。 -
$thisを忘れると、エラーが出てそのプロパティにアクセスできない。
これを何回かやらかして、ようやく少し慣れてきた感じです.
しっかり意識さえすればなんてことはないんですが、それまでが大事なんだなと痛感しました。
似たようなミスで躓いた人がいたら、参考になればいいなぁと。