LoginSignup
TaikiTkwkbysh
@TaikiTkwkbysh (若林 泰希)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Progate PHPコースⅡ 16/18ページの内容が理解出来ません。

Progate PHPコースⅡ 16/18ページにて コードの内容が理解出来ない。

プログラミング初学者です。現在、web制作プログラマーを目指してPHPの勉強を
Progateで行っている最中なのですが、
PHPコースⅡ 16/18ページにて行われている内容が一部理解出来ず、
進めずに困っている状態です。

下記に記載している部分のコードで、どういった処理が行われているのかを
ご教授頂けますと幸いです。

問題

![スクリーンショット 2020-09-29 18.10.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754263/ec65e7b1-7e8c-f762-2a78-7ddbf309933c.png)

税込金額のテキストボックスに数量を入力し、Enterキーを押すと、

![スクリーンショット 2020-09-29 18.10.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754263/e2409ac1-d0f9-d965-38c8-996ca082465d.png)

商品名と各数量が表示される。

エラーメッセージ

エラーメッセージは無く、回答としても正解と表示されました。

ファイル① index.php

//ファイル名 index.php

<?php require_once('data.php') ?>

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Café Progate</title>
  <link rel="stylesheet" type="text/css" href="stylesheet.css">
  <link href='https://fonts.googleapis.com/css?family=Pacifico|Lato' rel='stylesheet' type='text/css'>
</head>
<body>
  <div class="menu-wrapper container">

    <h1 class="logo">Café Progate</h1>

    <form method="post" action="confirm.php">

      <div class="menu-items">

        <?php foreach ($menus as $menu): ?>

          <div class="menu-item">

            <img src="<?php echo $menu->getImage() ?>" class="menu-item-image">

            <h3 class="menu-item-name"><?php echo $menu->getName() ?></h3>

            <p class="price">¥<?php echo $menu->getTaxIncludedPrice() ?>(税込)</p>

                          ↓理解出来ていない箇所①
            <input type="text" value="0" name="<?php echo $menu->getName() ?>">
            <span></span>

          </div>
        <?php endforeach ?>
      </div>
      <input type="submit" value="注文する">
    </form>
  </div>
</body>
</html>

ファイル ② data.php

//ファイル名 data.php

<?php require_once('menu.php');

$juice = new Menu('JUICE', 600, 'imageのURL');
$coffee = new Menu('COFFEE', 500, 'imageのURL');
$curry = new Menu('CURRY', 900, 'imageのURL');
$pasta = new Menu('PASTA', 1200, 'imageのURL');

$menus = array($juice, $coffee, $curry, $pasta);

?>

ファイル③ menu.php

//ファイル名 menu.php

<?php
class Menu {
  private $name;
  private $price;
  private $image;

 ↓理解出来ていない箇所②
  private $orderCount = 0;


  public function __construct($name, $price, $image) {
    $this->name = $name;
    $this->price = $price;
    $this->image = $image;
  }

  public function hello() {
    echo '私は'.$this->name.'です';
  }

  public function getName() {
    return $this->name;
  }

  public function getImage() {
    return $this->image;
  }


  public function getOrderCount() {
    return $this->orderCount;
  }

  public function setOrderCount($orderCount) {
    $this->orderCount = $orderCount;
  }

  public function getTaxIncludedPrice() {
    return floor($this->price * 1.08);
  }

}
?>

ファイル④ confirm.php

//ファイル名 confirm.php

<?php require_once("data.php") ?>

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Progate</title>
  <link rel="stylesheet" type="text/css" href="stylesheet.css">
  <link href='https://fonts.googleapis.com/css?family=Pacifico|Lato' rel='stylesheet' type='text/css'>
</head>

<body>
  <div class="order-wrapper">
    <h2>注文内容確認</h2>
    <?php foreach ($menus as $menu): ?>


      ↓理解出来ていない箇所① 、② 
      <?php $orderCount=$_POST[$menu->getName()] ?>
      <p class="order-amount">

        <?php echo $menu->getName(); ?>
        x
        <?php echo $orderCount; ?></p>
    <?php endforeach ?>
  </div>
</body>
</html>

理解出来ていない箇所①

結論としましては、2枚目のスクリーンショットの注文内容確認で、
テキストボックスに入力した数値を反映させているコードがどの箇所なのか理解出来ていない状態です。
自身で考え、この箇所ではないかと思う所に「理解出来ていない箇所①」とコード内に記載をしたのですが、もしこの箇所であるなら、何故この指示で反映されるのでしょうか。
getNameメソッドはnameプロパティを戻り値としているのに、数値として出力されているのが分かりません。
もし違う箇所が処理をしているのであれば、どのコードが処理をしているのか教えて頂けますと、幸いで御座います。

理解出来ていない箇所②

ファイル③ menu.php にて、$orderCountはprivateにしているのに、
ファイル④ confirm.phpにて クラス外から変更を加えているように見えるのですが、何故変更できるのでしょうか。
privateはあくまでクラス外からecho等で取り出すことが出来ないだけで、変更は出来ると言うことなのでしょうか。

以上になります。長文及び大変分かりづらい説明になってしまうかと存じますが、
何卒ご教授の程、宜しくお願い申し上げます。

1

1Answer

理解出来ていない箇所①

説明のために index.php の注文フォームから関係ないタグを取り除いて以下に示します。

 <form method="post" action="confirm.php">
  <?php foreach ($menus as $menu): ?>
  <input type="text" value="0" name="<?php echo $menu->getName() ?>"><?php endforeach ?>
  <input type="submit" value="注文する">
</form>

この部分を実行すると以下の HTML が生成されます。

<form method="post" action="confirm.php">
  <input type="text" value="0" name="JUICE">
  <input type="text" value="0" name="COFFEE">
  <input type="text" value="0" name="CURRY">
  <input type="text" value="0" name="PASTA">
  <input type="submit" value="注文する">
</form>

これで分かるように、 $menu->getName() は input 要素の name 属性の値を書き出すもので個数とは関係ありません。

このフォームの「注文する」ボタンを押すと、ブラウザはフォームのデータを confirm.php に送信し、返ってきた HTML を表示します。(フォームデータの送信について詳しく学びたい場合は https://developer.mozilla.org/ja/docs/Learn/Forms/Sending_and_retrieving_form_data を参照してください。)

PHP はブラウザから受け取ったデータを連想配列変数 $_POST に入れて confirm.php を実行します。変数の中身は $_POST["JUICE"] === "3", $_POST["COFFEE"] === "5" のように、「input 要素の name の値」をキーとし、「その name の input 要素が表すテキストボックスに入力された文字列」が値になっています。

2枚目のスクリーンショットで注文確認画面として表示されているのは confirm.php が返した HTML です。個数を表示している部分は以下です。

    <?php foreach ($menus as $menu): ?>
      <?php $orderCount=$_POST[$menu->getName()] ?>
      <p class="order-amount">
        <?php echo $menu->getName(); ?>
        x
        <?php echo $orderCount; ?></p>
    <?php endforeach ?>

4つのメニューそれぞれについて、 $orderCount=$_POST[$menu->getName()] で注文個数を取り出して表示しています。

理解出来ていない箇所②

      <?php $orderCount=$_POST[$menu->getName()] ?>
      <p class="order-amount">
        <?php echo $menu->getName(); ?>
        x
        <?php echo $orderCount; ?></p>

ここで $orderCount は引用部1行目の <?php $orderCount=$_POST[$menu->getName()] ?> で定義された変数です。 Menu クラスの $orderCount インスタンス変数とは関係ありません。

ご質問のコードで Menu クラスの $orderCount, getOrderCount(), setOrderCount() はどこからも使われていないようです。

0

Comments

  1. @TaikiTkwkbysh

    Questioner
    ご回答頂き、誠に有難う御座います。
    大変納得致しました。ご教授有難う御座います。

    ご教授頂いた内容を元に、今回の内容を自分なりに整理してみましたので、
    もし宜しければこちらで正しいかどうかも見て頂けましたら幸いです。

    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

    <input type="text" value="0" name="<?php echo $menu->getName() ?>">

    <input type="text"  
    ↑ HTMLで、テキストボックスを生成するコード

    value="0"      
    ↑ HTMLで、テキストボックスに初期段階で表示しておく数値を決めているコード

    name="<?php echo $menu->getName() ?>">
    ↑ PHPで、ご教授頂いた通り、input要素のname属性の値を引き出す為のコード
     あくまで属性を表しているコードで、nameの表示を指示している訳でも、数値を表示する訳でも
     無い。
     テキストボックス内に入力された文字列を値として送信する為に必要なコード。

    <?php $orderCount=$_POST[$menu->getName()] ?>

    <?php $orderCount
    ↑ confirm.php内で新しく定義された変数。menu.phpのクラス内で定義されたインスタンスとは別物なので、関係ない。

    =$_POST
    ↑Formタグで送信する値 = テキストボックスに入力した文字列を受け取る為のコード。

    [$menu->getName()] ?>
    ↑input要素のname属性を指定しているコード。
    これにより、テキストボックスに入力された文字列が渡される。
    (※この部分を最初、getNameメソッドを引数として入れていると勘違いしていました。)


    <?php echo $orderCount; ?>
    ↑数値を表示するコード

    テキストボックスに入力した値がどこかのコードで変換されて表示されているという訳では無く、
    ・Formタグで送信先、送信方法を指示
    ・name属性でテキストボックスに入力されたデータのキー名を定義
    ・$_POST[キー名] でデータを受け取る
    この方法でテキストボックス内の値がデータになる。
  2. その理解で合っていると思います!
  3. @TaikiTkwkbysh

    Questioner
    承知致しました。
    ご回答有難う御座います!
    また機会が御座いましたら、ご回答宜しくお願い致します!

Your answer might help someone💌