学習記録:PHP その2


9月1~2日 PHP

今回の3章は画像のようなページを作ることが目標

・メニュー4品の4の部分はメニュー数に合わせて変わるように
 インスタンスが生成されるたびに1加算し、その結果を数字として表示するように
・飲み物は「アイス・ホットの情報」、食べ物は「辛さの情報」が
 それぞれ表示されるようにファイルを分けて定義

続けて4章ですが

・商品名をクリックで飛べるリンク先ページの生成
・クリックした商品に合わせたレビューページの作成
・レビュー者情報が重複しないような仕組みの構築

いやぁ…ほんと、これ難しすぎです…。

 個人的なメモ

クラスプロパティ
個々のインスタンスではなく、クラスが持つデータ(クラスプロパティ)
の定義とアクセス方法について

menu.php
  <?php
class Menu { 
//クラスプロパティを定義する場合は「static クラスプロパティ名」とする
//ここのインストラクタに関与させない場合には、staticをつける
private static $count = 0 ; 
//クラス内でクラスプロパティにアクセスする場合は「self::$クラスプロパティ名」とする
self::$count ++ ;
}
  ?>
index.php
<?php 
  //クラスプロパティにアクセスする クラス名::$クラスプロパティ名
  echo Menu::$count 
?>

継承した親クラスのメソッドの呼び出し(オーバーライド)

drink.php
  <?php
//別のクラスを継承する場合は 「class 子クラス名 extends 親クラス名」とする 
 class Drink extends Menu {
  private $type;
  public function __construct($name, $price, $image, $type) {
    // 親クラスのコンストラクタを呼び出す場合は「parent::メソッド名」
    parent::__construct($name, $price, $image) ;
    $this->type = $type;
  }
  ?>

PHP内でifやforを使用する場合
if文、for文、while文、witch文foreach文を書く場合は、
「endif」「endfor」「endwhile」「endswitch」「endforeach」を使用して閉じる

index.php
// $menuで呼び出されたクラスがドリンクであれば実行したい
// → instanceof で判定させる
//改行を含まない<?php ?>の場合は、<?php : ?>のようにコロンを使用する
<?php if ($menu instanceof Drink): ?>
 <p class="menu-item-type"><?php echo $menu->getType() ?></p>
//<?php else : ?>で条件分岐をさせているが、:を使用することに注意
<?php else : ?>
 <p><?php echo '辛さ:'. $menu->getSpiciness() ?></p>
//<?php if ?>を閉じるために<?php endif ?>を置く。:は使用しない。
<?php endif ?>

クエリ情報の追加
URLの末尾の「?」以降に「キー名=値」の形で簡単な情報をのせることができる。
これをクエリ情報といい、クエリ情報を用いてリンク先のページに情報を渡すことができます。

Q.なぜ情報を渡す必要があるのか?
A.クエリ情報に入っている内容によって、表示させる内容を変えるため(たぶん)

index.php
<a href= "show.php?name= <?php echo $menu->getName()?> " >
 <?php echo $menu->getName() ?>
</a>
show.php
<?php
// クエリ情報の値(?以降の情報)を受け取るには、$_GET['キー名']で定義する。
 $menuName = $_GET['name'] ;
// 第2引数にはクエリ情報に入力された商品名が入り、第1引数は配列化されたmenusの値が順番に入る
// findByNameのクラスメソッドでは、クエリ情報と配列の一致した値を戻り値としている
 $menu = Menu::findByName($menus, $menuName);
?> 
show.php
<?php
class Menu {

//getreviewsに$reviewsForMenuの値が戻り値として入る。
  public function getReviews($reviews) {
// 空の配列
    $reviewsForMenu = array() ;
    foreach($reviews as $review) {
      if ($review->getMenuName() == $this->name) {
// $reviewsForMenu[]の配列の末尾に値を追加する。
//最終的に$reviewsForMenuの配列には、特定の商品名のreviewがすべて入った状態になる。
        $reviewsForMenu[] = $review ;
      }
    }
   return $reviewsForMenu ;
   } 
}
?>