質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

Q&A

解決済

3回答

2139閲覧

php 関数の引数の初期値について

hiro0208

総合スコア75

PHP

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

0グッド

0クリップ

投稿2017/05/12 02:21

フォームから第2引数を空で入力すると初期値の設定で1が返されると思ったのですが、出力が以下のように「0」になります。なぜでしょうか?

Warning: A non-numeric value encountered in
0

php

1<!doctype html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>sample</title> 6</head> 7<body> 8<?php 9function charge($rank, $days = 1) { 10 switch ($rank) { 11 case 'A': 12 $ryoukin = 15000 * $days; 13 break; 14 case 'B': 15 $ryoukin = 12000 * $days; 16 break; 17 default: 18 $ryoukin = 8000 * $days; 19 break; 20 } 21 return $ryoukin; 22} 23?> 24<form action="" method="post"> 25ランクAorB<input type="text" name="rank" size="10" value=""> 26日数<input type="text" name="days" size="10" value=""> 27<input type="submit" name="btn" value="送信"> 28</form> 29<?php 30if (isset($_POST['btn'])) { 31 $sum = charge($_POST['rank'] ,$_POST['days']); 32 echo $sum . '<br>' . "\n";; 33} 34?> 35</body> 36</html>

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

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

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

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

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

guest

回答3

0

ベストアンサー

PHP

1$sum = charge($_POST['rank'] ,$_POST['days']);

となっているので、第二引数は空ではなく「常に与えている」状態です。
ここを

PHP

1$sum = charge($_POST['rank']);

のように修正すると、第二引数を空で与えている事となり、期待通りの動作となるかと思います。

そして「0が出力される」と言う事象から判断すると、第二引数を空にしているのではなく「日数($_POST['days'])に空文字(未入力)でPOSTしている」という事ではないかな?と思いますが、いかがでしょうか。

この場合、$_POST['days'] = '';とした場合と同じ結果となり、つまりcharge($_POST['rank'], '');と書いているのと同じになります。
その結果、空文字が数値に変換されて、第二引数に0(ゼロ)が与えられた状態になっている、と言うところでしょうか。

回避するとしたら、charge()に処理を渡す前に判定を入れて

PHP

1$sum = $_POST['days'] === '' ? charge($_POST['rank']) : charge($_POST['rank'] ,$_POST['days']);

とするような形でしょうか。

投稿2017/05/12 02:34

編集2017/05/12 04:04
kunai

総合スコア5405

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

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

0

初期値が適用されるのは、引数自体書かなかった場合になります。

PHP

1$sum = charge($_POST['rank']);

現状のコードでは、$_POST['days']に値は入っていない(=未定義)なのでNULLが代用されるようです(下記サイト参照)
http://qiita.com/mpyw/items/0a4ea0bc9a695da33f0c

つまり、こう書いているのと同じなので、初期値は適用されません。

PHP

1$sum = charge($_POST['rank'], NULL);

投稿2017/05/12 02:33

ttyp03

総合スコア16998

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

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

hiro0208

2017/05/12 02:55

ありがとうございます。 NULLや未定義について確認してみます。
guest

0

空で初期値を上書きしているからではないでしょうか?

初期値を活かす書き方であれば、

charge($_POST['rank']);

のみとなるはずです。

投稿2017/05/12 02:26

s.t.

総合スコア2021

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

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

hiro0208

2017/05/12 03:27

自分で作った関数なのに、使い方を理解できていなかったです。ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問