JavaScriptSとPHPを使ってWEBサイトを作成しています。
いままでは
var is_flag = false;
$is_flag = false;
のように真偽値で実装してきたのですが、
ここにきて、POSTの時は勝手にtrue
が1
になることを知りました!(ウザすぎませんか?w)
そこで疑問で、それならもう一切true|false
は使わずに、1|0
でいこうかと思い立ったのですが、これには何か問題があるでしょうか?
自分で思いついた問題は
・「数値がない」という意味での0
か?
・「false
」という意味での0
か?
がわかりにくくなってしまう問題くらいしか思いつかず、なら「数値がない」ときはnull
を使えばいいかな、と思っているのですけども、他に何か問題ってあるでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/29 04:13
2020/11/29 04:16
2020/11/30 05:21
回答5件
0
ベストアンサー
ここにきて、POSTの時は勝手にtrueが1になることを知りました!(ウザすぎませんか?w)
コードの記載も無く質問が曖昧なので説明は控えますが、postで送れるパラメーターについて調べてみてはいかがでしょうか。仕様の誤解によって起きている問題や疑問ならそれだけで解決するかもしれません。
これには何か問題があるでしょうか?
どちらの言語もtrueまたはfalseを返す関数が存在します。また、1===true
はfalse
です。
これらを踏まえて考えればbooleanはbooleanとして扱う癖をつけておけばバグの発生率が下がります。
投稿2020/11/28 15:29
総合スコア6426
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/28 18:03
2020/11/29 04:14
0
型が意識されない実装は危険でメンテナンス性に欠けます。
一般的には永久にメンテナンスも改修も発生しないものはありませんし、ずっと同じ人がメンテナンスし続けることはありません。
設計書がきちんと残っていればまだ良いですが、ないか、あってもアップデートが適切にされてない場合、コードが最新の設計書となってしまいます。
型がきちんとされているかいないかで、全く知らない人、または数ヶ月数日後の自分に優しいコードになります。
コメントだけを期待、あてにしてはいけません。
投稿2020/11/28 23:21
総合スコア80875
0
0や1でやってもいいんですが、
ある場面での0や1が数値としての0や1なのかフラグとしてのものなのかわからなくなるのと、
なにか変なデータが入ってきたりしてじゃぁ2や3だったときに0として扱うのか1として扱うのかって
逆に面倒になるっていうか。
フォームでGETやPOSTで受信するデータは基本的に文字列なので
文字列としての0や1も含めると、
PHPはデータ型を意識して処理を書いていかないと、
見誤ることが経験上多いのでtrue|falseを使うと決めたらそれを通すことを
意識的にやったほうがいいです。
PHPだけの話として、これは頭に入れておいたほうが良いです。
PHP isset, empty, is_null の違い早見表 - Qiita
何をtrue|falseと判断するのか、挙動を知っとかないとデバッグのときにハマります。
別の言語ではまた癖が違うので、それはそれで。
投稿2020/11/28 15:28
編集2020/11/29 02:47退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/29 04:03
2020/11/29 04:11
0
がわかりにくくなってしまう問題
それが大問題です。
数値なのか真偽値なのかわからないってのはやばくないですか?
まあ、それで構わないと言うなら、それまでのはなしですが。
投稿2020/11/28 15:17
総合スコア88038
0
解決されたようですが、簡単なコメントをします。
0 が false であるのが分かりにくいと言われているようですが、他の言語でも false を意味することが多いです。 ちなみに、 1 が trueではなく、0以外がtrue という取り扱いです。 覚え方としては ゼニ (ゼロは偽:にせ)として覚えれば間違いありません。
「回答に含めるべき内容は回答に追記しましょう。」
と書かれていますので、内容は重なりますが、コメントした分を追記します。
少し大雑把に書きすぎましたね。
何事にも例外はあります。 しかし、例外は基本があっての例外ですから、基本を間違いなく覚えることが必要です。
0 を false とする言語は、多いです。
C, C++, JS, PHP, Perl はそうです。 Javaは文法違反。 Ruby と シェルでは trueと扱われます。
また、文字列が等しい場合、strcmp() の 0 を返しますがこれは文字列間のノルムを計算しているからです。
シェルでは成功した場合0を返すのがエラーがないことを他の数値はエラーコードを示すようになっているのが理にかなっているからです。
false を 0, true を !0 というのは、コンピュータ以前のBool代数の生みの親、ジョージ・ブールの時代から扱われていたようです。
-- ここからさらに追加
コンピューター言語学的には0,1とbooleanとは別物だったと言う考えには賛成いたします。 コード可読性点から言っても、false, trueを使うべきです。
以下は、質問の内容から逸れてしまい雑談レベルとして考えてください。
私の経験から言いますと、実装環境において、0をfalseと同様に取り扱われている事が多いという考え方を覚えているのは有用だと思います。 使うべきではありませんが、特に他人の実装を読み解くときにです。 思い切り排除する必要はないと思います。
コンパイラーやインタプリタよってバイナリに変換された場合、最終的にすべてのコードは、0,1に変換されます。 この時、0をfalseにしたほうが都合が良いことが多いのです。
たとえば、単純なループを作成するとき、レジスタをカウントダウンしてJNZ命令でループの先頭に戻ると言う処理です。 0(false)の時ジャンプせずループを抜けるわけです。
これまで多くの言語設計者は、こう言った事情があって、0 を falseと同様に扱えるようにしてきたのでしょう。 ただし、厳密な論理性を重視した比較的新しい言語においては、CPU アーキテクチャが充実してきた現在、必ずしもそうでは無いです。
これまで静的型付けを回避してきたRubyで、反対に 0 が true として取り扱われているのは興味深いところです。
投稿2020/12/01 11:42
編集2020/12/01 17:18総合スコア19
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/01 12:37
2020/12/01 14:06 編集
2020/12/01 14:29
2021/05/07 11:56
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。