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

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

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

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

PHP

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

3回答

2271閲覧

PHP 関数の引数バリデーションチェック

退会済みユーザー

退会済みユーザー

総合スコア0

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

PHP

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

1クリップ

投稿2019/11/22 03:28

編集2019/11/22 04:17

前提・実現したいこと

三角形の面積の引数チェックに関して質問です。
引数に任意の数字を与える際にいずれかの引数が空の時、または数字でないときはNULLを表示し、
上記ではない時は三角形の面積結果の数字を返す。この時の引数チェックで少し迷っています。

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

$height, $widthを文字または空文字を入れる場合 NULL(画面上ではから表記)ではなく0と表記されてしまう。

該当のソースコード

ソースコード function triangle($h,$w){ $total = $h*$w/2; return $total; } $height = 100; $width = 50; $sum = triangle($height,$width); echo '三角形面積:' . $sum;

試したこと

triangle関数内に下記を試してみました。
1: is_numeric、is_null関数を使って条件分岐
if(!is_numeric($total) && !is_null($total)){
return null;
}else{
return $total;
}
2: preg_match関数を使って条件分岐
if (!preg_match('/\A[0-9]+\z/', $total)) {
return null;
} else {
return $total;
}
3:is_int関数を使って整数チェック
if(is_int($total)){
return $total;
}else{
return null;
}

追記:
上記、計算の合計値をバリデーションチェックしていた為、下記に変更。
if(is_numeric($h)){
if(is_numeric($w)){
$total = $h*$w/2;
return $total;
}else{
return NULL;
}
ご教示のほど宜しくお願い致します。

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

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

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

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

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

m.ts10806

2019/11/22 03:32

関数の引数ではなく直接的に中でやってるのはバリデーションなので、そう表現された方が伝わりやすいと思います。
m.ts10806

2019/11/22 03:34

というか、なぜ渡された引数ではなく計算結果の変数をチェックしているのですか?
m.ts10806

2019/11/22 04:02

何度も追記願う形になりますが、 「NULLを表示」とはどういう結果をイメージされてますか? "NULL"と画面に表示させたいのか、NULLを返してechoするだけなのか(画面上は空表示)、ハッキリと書かれた方が良いと思います。 現在のコードからは後者を目指しているように見受けられます。
退会済みユーザー

退会済みユーザー

2019/11/22 04:06

ご返信ありがとうございます。 言葉足らずで申し訳ございません。引数のバリデーションチェックに修正致します。 is_numeric関数等、1つのパラメータのみバリデーションチェックが可能な為合計値でチェックが可能か試みていました。しかしご指摘の通り、結果を変数チェックしても結果のみがバリデーションチェックされる為、引数はチェックされないことに気がつきました。 NULLに関しては後者を目指しております。 それぞれの引数のバリデーションチェックを条件分岐のネスト構造にしてみようかと思っております。 if(is_numeric($h)){ if(is_numeric($w)){ $total = $h*$w/2; return $total; }else{ return NULL; }
m.ts10806

2019/11/22 04:11

質問は編集できますので質問本文に追記してください。 今回の条件でネストさせるとelseも増えて可読性も落ちますし、ひとつのifで複合条件で十分と思います。 あと引数の型宣言も利用するとより厳格な作りになると思います。
退会済みユーザー

退会済みユーザー

2019/11/22 04:28

ご返信頂きありがとうございます。 ifの複合条件そして、引数の型宣言を利用してもう少し厳格な作りにしてみたいと思います。 引数の型宣言に関してもう少し調べていきたいと思います。
m.ts10806

2019/11/22 04:59

PHPマニュアルをフル活用してくださいね
退会済みユーザー

退会済みユーザー

2019/11/22 05:47

ありがとうございます。 PHPマニュアル読解していきたいと思います!
m.ts10806

2019/11/22 05:52

読解…というより実際は辞書がわりに使うことになります。仕様書、取扱説明書みたいなものですね。
guest

回答3

0

ベストアンサー

どこまで厳密に評価したいかによりますね

PHP

1function triangle($h=null,$w=null){ 2 if(!is_numeric($h) or !is_numeric($w) or is_string($h) or is_string($w)) return null; 3 return $h*$w/2; 4} 5 6var_dump(triangle(10,20));//int(100) 7var_dump(triangle(1.5,2.3));//float(1.725) 8var_dump(triangle(0,0));//int(0) 9var_dump(triangle(1e2,1));//float(50) 10var_dump(triangle(1)); //null 11var_dump(triangle(1,"10")); //null 12var_dump(triangle(1,false)); //null 13var_dump(triangle(1,[1,2,3])); //null

投稿2019/11/22 04:23

yambejp

総合スコア114572

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

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

退会済みユーザー

退会済みユーザー

2019/11/22 04:35

ご回答頂きありがとうございます。 数値のみ入れたいと考えております。 文字、または空欄の場合にはnull表示をしたいと考えいます。 is_String関数を使用することは考えていなかったのでis_String関数を使ってもう少し厳密チェックにしていきたいと思います。
yambejp

2019/11/22 04:38

念の為、is_stringのありなしで var_dump(triangle(1,"10")); の結果が違ってきます
退会済みユーザー

退会済みユーザー

2019/11/22 04:41 編集

ご返信ありがとうございます。 is_stringのありなしでvar_dumpの方を試してみたいと思います。
guest

0

バリデーションチェックを合計値で考えていた為、各引数にバリデーションチェックを行う。
バリデーションに関して以下を試みる。
Is_numericの複合条件分岐を行い、引数の型チェックを行ってみる。
IS_numeric、IS_String関数でバリデーションチェックを行ってみる。
関数を2つ用意してバリデーションチェックを試みる。

投稿2019/11/22 04:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

おす!

function is_num($value) : bool { return (!isset($value) || !is_numeric($value) ? false : true; } function triangle($h, $w) { if(!is_num($h)) { return null; } if(!is_num($w)) { return null; } return ($h * $w) /2; } $result = triangle($h, $w); echo (is_null($result)) ? "NULL" : $result ;

こんな感じでいいか?

投稿2019/11/22 03:46

編集2019/11/22 03:51
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/11/22 04:28

ご回答頂きありがとうございます。 関数を2つ用意してバリデーションチェックする方法も試みていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問