質問するログイン新規登録
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1767閲覧

ProgateのPHPをやっていますが…

YYmd0525

総合スコア10

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/02/25 12:49

0

0

前提・実現したいこと

ProgateのPHP、オブジェクト指向のあたりをやっていますが、
一点わからないところがあったので質問させてください。

発生している問題・エラーメッセージ

$orderCount = $_POST[$menu->getName()]; これは文字列が入っていませんか? この後$orderCountを引数にして、MenuクラスのプロパティにorderCountがsetして、 計算されるわけですが、この$orderCountがなぜ数値になるのか教えていただきたいです。

該当のソースコード

PHP

1<?php 2class Menu { 3 private $name; 4 private $price; 5 private $image; 6 private $orderCount = 0; 7 8 public function __construct($name, $price, $image) { 9 $this->name = $name; 10 $this->price = $price; 11 $this->image = $image; 12 } 13 14 public function hello() { 15 echo '私は'.$this->name.'です'; 16 } 17 18 public function getName() { 19 return $this->name; 20 } 21 22 public function getImage() { 23 return $this->image; 24 } 25 26 public function getOrderCount() { 27 return $this->orderCount; 28 } 29 30 public function setOrderCount($orderCount) { 31 $this->orderCount = $orderCount; 32 } 33 34 public function getTaxIncludedPrice() { 35 return floor($this->price * 1.08); 36 } 37 38 public function getTotalPrice() { 39 return $this->orderCount * $this->getTaxIncludedPrice(); 40 } 41 42} 43 44$juice = new Menu('JUICE', 600, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/juice.png'); 45$coffee = new Menu('COFFEE', 500, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/coffee.png'); 46$curry = new Menu('CURRY', 900, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/curry.png'); 47$pasta = new Menu('PASTA', 1200, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/pasta.png'); 48 49$menus = array($juice, $coffee, $curry, $pasta); 50 51?> 52<!DOCTYPE html> 53<html> 54<head> 55 <meta charset="utf-8"> 56 <title>Progate</title> 57 <link rel="stylesheet" type="text/css" href="stylesheet.css"> 58 <link href='https://fonts.googleapis.com/css?family=Pacifico|Lato' rel='stylesheet' type='text/css'> 59</head> 60<body> 61 <div class="order-wrapper"> 62 <h2>注文内容確認</h2> 63 <?php foreach ($menus as $menu): ?> 64 <?php 65 $orderCount = $_POST[$menu->getName()]; 66 $menu->setOrderCount($orderCount); 67 68 ?> 69 <p class="order-amount"> 70 <?php echo $menu->getName() ?> 71 x 72 <?php echo $orderCount ?> 7374 </p> 75 <p class="order-price"><?php echo $menu->getTotalPrice(); ?></p> 76 <?php endforeach ?> 77 </div> 78</body> 79</html>

HTML

1<?php require_once('data.php') ?> 2 3<!DOCTYPE html> 4<html> 5<head> 6 <meta charset="utf-8"> 7 <title>Café Progate</title> 8 <link rel="stylesheet" type="text/css" href="stylesheet.css"> 9 <link href='https://fonts.googleapis.com/css?family=Pacifico|Lato' rel='stylesheet' type='text/css'> 10</head> 11<body> 12 <div class="menu-wrapper container"> 13 <h1 class="logo">Café Progate</h1> 14 <form method="post" action="confirm.php"> 15 <div class="menu-items"> 16 <?php foreach ($menus as $menu): ?> 17 <div class="menu-item"> 18 <img src="<?php echo $menu->getImage() ?>" class="menu-item-image"> 19 <h3 class="menu-item-name"><?php echo $menu->getName() ?></h3> 20 <p class="price">¥<?php echo $menu->getTaxIncludedPrice() ?>(税込)</p> 21 <input type="text" value="0" name="<?php echo $menu->getName() ?>"> 22 <span>個</span> 23 </div> 24 <?php endforeach ?> 25 </div> 26 <input type="submit" value="注文する"> 27 </form> 28 </div> 29</body> 30</html>

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takasima20

2020/02/25 14:04

webシステムというか、http では「基本的に」文字のやりとりしかしません。submitされた情報を受け取った時点ではすべてが文字列です。それを各言語環境がどのように扱うかはまた別の話ですね。 というか、今回は $_POST の中身がイメージできてなかったということでしょうか。
YYmd0525

2020/02/25 20:57

イメージできてなかったですね… name属性もphpで記述するのが初めてでしたので、頭がごちゃごちゃになってました。 ある書籍で、DBでintに指定されたものにPOSTを送る際は(int)の型変換をしなければならないというのを思い出しました。 基本的に文字列を扱うんですね。。勉強になりました。
guest

回答2

0

この$orderCountがなぜ数値になるのか教えていただきたいです。

なっていません。そのまま文字列として入っています。

なお、getTotalPriceではorderCountに掛け算をしていますが、PHPでは*演算を行えるのが数値だけなので、演算の際に数値へ変換されます。

投稿2020/02/25 12:55

maisumakun

総合スコア146775

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YYmd0525

2020/02/25 13:10

ご返信ありがとうございます。 <?php foreach ($menus as $menu): ?>のすぐあとで、 var_dump($_POST)としました。数値を2と決めて、注文するボタンを押しましたところ、String型の2が入っていました。 POSTの配列の中に、文字列が入っているのかの確認はどのようにしたらいいでしょうか。。
maisumakun

2020/02/25 13:14

> POSTの配列の中に、文字列が入っているのかの確認はどのようにしたらいいでしょうか。。 確認するまでもありません。POSTで送れる値は「文字列」「ファイル」とそれらの配列しかないので、数値が届くことはありません。
YYmd0525

2020/02/25 13:24

すみません、勘違いをしていたようです。 inputのnameはそれぞれの名前で、そこにvalueで数値が送られていました。 Array ( [JUICE] => 0 [COFFEE] => 0 [CURRY] => 3 [PASTA] => 0 ) 上記の数量を$orderCount = $_POST[$menu->getName()]で取り出して、計算に使ったということですよね。 連想配列からやり直します。。
guest

0

ベストアンサー

var_dump($_POST);とか書けば、
受信したパラメータが文字列であることくらい、
わかるはずですよ。

だから、
$orderCount = $_POST[$menu->getName()];
$orderCountには文字列で入ります。

$this->orderCount = $orderCount;
の場面も、文字列のまま記憶されます。
なんなら、$this->orderCount = $orderCount; の直後に
var_dump($this->orderCount);を仕込めばいい。

return $this->orderCount * $this->getTaxIncludedPrice();
の場面で、
$this->orderCountが文字列であっても
$this->getTaxIncludedPrice()が数値なので、
文字列を暗黙の型変換で数値(float もしくは 整数)として扱って計算されているだけです。

PHP: 型の相互変換 - Manual

PHP の自動型変換の例の一つは、乗算演算子 '*' です。 オペランドのどれかが float の場合、全てのオペランドは float として評価され、結果は float になります。 その他の場合、オペランドは整数として解釈され、結果も整数になります。 この自動型変換は、 オペランド自体の型を変更するものではないということに注意してください。 変わるのは、オペランドがどのように評価されるかだけです。

投稿2020/02/25 13:33

編集2020/02/25 13:42
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YYmd0525

2020/02/25 21:02

本当によくわかりました。 '文字列'だったのですね、文字列としての2や3が入っていて、 最終的に$this->getTaxIncludedPrice()が数値なので、 変換されて計算されたということですね。 $_POST[$menu->getName()];とゲッターを使っている事で頭がごちゃごちゃになっており、POSTの中身が把握できてませんでした。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問