35日目:PHP 学習:複数クラスの横断情報管理(レビュー者とコメント紐づけ、レビュー者の属性とアイコンの紐づけ)
<学習日>
35日目
<学習内容>
① PHP Ⅳ(58-100%):複数クラスの横断情報管理(レビュー者とコメント紐づけ、レビュー者の属性とアイコンの紐づけ)
<参考>
Progateレベル:147
<学習内容詳細>
なんとか、PHPの全単元を完了することが出来ました!
後半はcodeが膨大になってきて、なかなかどの引数をどこで受けて、この関数はどういった経路でなにを引っ張ってきているのか、全体像を把握するのが難しく、実際にcodeを書いている時間よりも、熟考する時間の方が長かった気がします^^;;
なんと、分割ファイルが2桁に!(0 0)
総じて言えることとして、Progateは「細かい指示に従っていれば脳死でもこなせる」ように出来てしまっているので、ポイントポイントで「もし白紙の状態だったらどうするか」と考えながら学習することが大切だと思います^^
そのうえで「ああ、そういくことか」と腑落ちする瞬間が楽しみでもありますから、「進めること」を目標にするのではなくて、「腑落ちすること」を目標にしてこれからもやっていこうと思います!
① PHP Ⅳ(58-100%):複数クラスの横断情報管理(レビュー者とコメント紐づけ、レビュー者の属性とアイコンの紐づけ)
関数を使いながら、複数作成しているクラスやインスタンスごとの情報をやりとりする内容が多かったです。
関数については、基本的にforeachで対象となるインスタンスを全て参照しつつ、条件に一致するインスタンスのみを抜き出して、実際のHTMLで抽出したデータでページを作成するという流れになっています^^
PHP学習の全体的な方針というのか、構成については閃き集でまとめることにして、今回は少し複雑な情報のやり取りを、具体的なcodeをあげながら振り返ります。
今回例に出すのは2つのcodeです!
・特定のメニューのインスタンス情報だけを反映させる
メニュー一覧から、特定のメニューをクリックしたときに、そのメニューについてのインスタンス情報だけが表示させるような機能を想定。同一クラスで管理。
【index.php】
foreach($menus as $menu)文の中で
<a href="show.php?name=<?php echo $menu->getName() ?>">
【show.php】
<?php
require_once('menu.php');
require_once('data.php');
$menuName = $_GET['name'];
$menu = Menu::findByName($menus, $menuName);
$menuReviews = $menu->getReviews($reviews);
?>
【menu.php】
public static function findByName($menus, $name) {
foreach ($menus as $menu) {
if ($menu->getName() == $name) {
return $menu;
}}}
解説1:「index.php」でボタンを押すと、そのメニューの名前の情報を「show.php」に飛ばす
解説2:「show.php」で飛ばされてきたメニューの名前を、「$menuName」で受ける。
解説3:「findByName()関数」で、クリックしたメニューの名前と同じ名前のプロパティをもつ「メニューインスタンス」を取得する。
解説4:得られたメニューインスタンスに格納された情報で、「show.php」を構成すれば、クリックしたメニューに関係する情報だけで構成されたページが作成できる。
・メニューごとに、そのメニューについてのレビューを取得する
メニュー一覧から、特定のメニューをクリックしたときに、そのメニューについてのレビューのみ表示させるような機能を想定。なお、レビューは別インスタンス管理としている。
【menu.php】
public function getReviews($reviews) {
$reviewsForMenu = array();
foreach ($reviews as $review) {
if ($review->getMenuName() == $this->name) {
$reviewsForMenu[] = $review;
} }
return $reviewsForMenu;
}
解説1:「レビュークラス」に「メニューの名前」プロパティを入れておく
解説2:空の配列を用意して、そこに「レビューに格納されたメニューの名前」と「メニューページのメニューの名前」が一致している時だけ、そのレビューインスタンスを格納するようにする。
解説3:最後に解説2で条件に一致した「レビューインスタンス」のみ格納された配列を、この関数に「return」で値として返す。
ということで、どうだったでしょうか。
基本的にプログラミングも「プログラミング言語」ですから、日本語に翻訳可能です。
数学と同じですね^^
優れた数学者が、日常言語以上の親和性で数式を脳内処理するのと同じで、優れたプログラマーは日常言語以上の親和性性で、プログラミング言語を脳内処理しているのだと思います!
そうはなれないでしょうし、なるつもりもありませんが、実用的な範囲であれば「日本語に翻訳できる」と思って理解すれば、意外にすんなり頭に入ってくるような気がします^^
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!