Blog

ブログ

なかなか覚えられないPHPのclassについて考えてみた

空いている時間にPHPの学習をはじめてずいぶん経つのですが、「クラス」の概念がなかなか理解できませんでした。
どう書けばどう動くまでは把握しているのですが、「なぜこんな風に書くのか」がつかめない。

コンストラクタとかメンバ変数なんて難しい言葉使うなよー><

でも、昨日の晩ふと「夕飯のメニュー」に例えて考えてみたら、ちょっと理解できたかもです。
メモしておこう。

関連:ひとり暮らしのしあわせヘビロテ食材
何故こんな記事を書いてるんだ…笑

スーパーで食材を買ってくる

夕飯のメニューは大体、スーパーに行ってから考えたりします。
思いつかないことも多いので、「使い回しのきく食材」を選びます。

この食材を「メンバ変数」と考えると

class banGohan {
	var $niku; //にく
	var $ninjin; //にんじん
	var $tamanegi; //たまねぎ
	var $naganegi; //ながねぎ
	var $kyabetsu; //きゃべつ
	var $shimeji; //しめじ
}

となります(たぶん)

食材からレシピをイメージする

使い回すレシピを考えるために、食材をイメージします。
これを「コンストラクタ」と考えると

class banGohan {
	//ここにさっきのコードが入る

	//コンストラクタ
	function banGohan($niku, $ninjin, $tamanegi, $naganegi, $kyabetsu, $shimeji) {
		$this->niku = $niku; //にく
		$this->ninjin = $ninjin; //にんじん
		$this->tamanegi = $tamanegi; //たまねぎ
		$this->naganegi = $naganegi; //ながねぎ
		$this->kyabetsu = $kyabetsu; //きゃべつ
		$this->shimeji = $shimeji; //しめじ
	}

}

です。
実際には冷蔵庫には既に調味料(しょうゆやみそ)も入っているので、継承されたクラスと考えてもいいのかもです。

定番レシピをセットしておく

上の食材があると、定番レシピがいくつかできます。
これを「メンバ関数」と考えてみると

class banGohan {
	//ここにさっきのコードが入る

	function banGohanTonjiru(){ //とんじる
		$nabe = $this->niku . $this->ninjin . $this->naganegi . $this->tamanegi;
		$nabe *= "miso" . "dashi" . "shouga";
		return $nabe;
	}

	function banGohanCurry(){ //カレー
		$nabe = $this->niku . $this->ninjin . $this->tamanegi . $this->shimeji;
		$nabe *= "curryroux" . "hachimitsu" . "yoghourt";
		return $nabe;
	}

	function banGohanYakisoba(){ //やきそば
		$huraipan = $this->niku . $this->ninjin . $this->naganegi . $this->kyabetsu;
		$huraipan *= "mushimen" . "sauce";
		return $huraipan;
	}

}

メンバ関数に入る値は、基本的に「肉」「にんじん」「きゃべつ」でなければならないですが、
肉が「100g88円の切り落とし」でも、「100g300円の無菌豚」でもいいわけです。にんじんもブランド品だろうがキズものだろうがバラものだろうがなんでもいいわけです。
レシピさえ確定していれば。

さて作るか

で、レシピに添って食材を実際に買ってきて作ります。

>//今週の場合
$konsyu = new banGohan("こまぎれ", "道内産三本袋", "バラ売り新玉ねぎ", "1本ものネギ", "1/4玉", "ホ○トのしめじ");
$kyo = $konsyu->banGohanTonjiru();
$asu = $konsyu->banGohanCurry();
$asatte = $konsyu->banGohanYakisoba();

//来週の場合
$raisyu = new banGohan("バラ肉", "バラ売りキズもの", "玉ねぎ三袋パック", "半分カット", "1/2玉", "地元農家のしめじ");
$kyo = $raisyu->banGohanCurry();
$asu = $raisyu->banGohanYakisoba();
$asatte = $raisyu->banGohanTonjiru();

レシピが確定しているので、いちいち本を読むこともなく、材料を買ってきては粛々と実行していきます。


と、ここまで妄想してみたのですが、なんか違う気がしてきました…;;
とりあえずclassの流れと使いどころは理解したので、今日のところはこれで良しとしよう…

追記:shuji_w6eさんが説明してくれました^^参考にどうぞ。
クラスとは変数をまとめて使う事のできるテンプレート