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

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

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

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

Q&A

解決済

2回答

306閲覧

PHPで任意の文字列の数値への型の相互変換が0に定義されている理由はなんだと思いますか?

WeilSpinor

総合スコア170

PHP

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

0グッド

0クリップ

投稿2019/03/26 05:12

編集2019/03/26 05:19

PHPにおいて、任意の文字列の数値への型変換は0となっていますが、どうにも気持ち悪い定義だと思いました。
というのも、数値と文字列のブール値への型変換は、
数値1はtrue、数値0はfalseであり、
空でない任意の(数字でない)文字列はtrue、空の文字列''はfalse、
という対応なっているからです。

ならば、文字列の数値への型変換は、
空でない任意の文字列を1に、
空の文字列''を0に、
それぞれ対応させるべきだと思います。

どう思いますか?
ご回答お待ちしております。

…と、
書いていて気づきましたが、そういえば、特に文字列のゼロ'0'のことを考えると、
「文字列ゼロ'0'と数値ゼロ0の対応は崩したくない」

「そのためには、任意の文字列の数値1への対応、という対称性は犠牲にするしかない」

という意図が篭っているのではないか、と思いました。

【追記】
maisumakun様のご指摘を受けて

確かにそうでした。
しかし、以下のマニュアルの==演算子の緩い型変換比較表
https://www.php.net/manual/ja/types.comparisons.php
においては、
例えば文字列'php'は数値0との比較でtrueを返し、数値1との比較でfalseを返す、とあります。

型変換という概念と、==での型の相互変換という概念は、全く異なるもの、ということでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

PHPにおいて、任意の文字列の数値への型変換は0となっていますが

なっていません。たとえば(int)'500万円'500です。

投稿2019/03/26 05:13

maisumakun

総合スコア145183

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

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

maisumakun

2019/03/26 05:16

そもそもPHPは、「プログラミング言語を作るつもりなどなかった」ところから進化してきたという、稀に見る言語です。複雑怪奇な歴史の名残で、わけのわからない箇所はあちこちにあります。
WeilSpinor

2019/03/26 05:22 編集

確かにそうでした。 しかし、以下のマニュアルの==演算子の緩い型変換比較表 https://www.php.net/manual/ja/types.comparisons.php においては、 例えば文字列'php'は数値0との比較でtrueを返し、数値1との比較でfalseを返す、とあります。 これは、そもそも、 『型変換』という概念と、『==での型の相互変換』という概念は、全く異なるもの、 ということでしょうか。 私はごっちゃにしていたのですが…
maisumakun

2019/03/26 05:23

いえ、同じものです。'php'を数値と==で比較しようとした場合、'php'が数値に変換されて0になり、それを比較する、ということで間違いありません。 同様に、'500万円' == 500は左辺が数値の500に変換され、trueとなります。
maisumakun

2019/03/26 05:24

この文字列→数値の変換の仕様は、Perlとも共通しますので、「$で始まる変数」「.による文字列連結」や「->によるメンバ参照」など、Perlの影響を受けた箇所も多いPHPがPerlから受け継いだものの1つなのかもしれません。
WeilSpinor

2019/03/26 05:41

ご回答ありがとうございます。 "任意の"文字列が、というのに語弊がありましたね。 私が例にあげた文字列が限定的すぎました。 文字列"810"は810に、 文字列"810先輩"は810に、 文字列"野獣先輩"は0に、 それぞれ変換する、という感じで覚えようと思います。 KazuhiroHatano様 リンクありがとうございます。ぜひ確認させていただきます
WeilSpinor

2019/03/26 05:48

歴史などが関係しているんですね。
guest

0

型キャストの事ですかね?

任意の文字列の数値への型変換は0となっていますが、

は間違いですね。おそらく

先頭が数字以外から始まる文字列の数値への型変換は0となっていますが、

の間違いでしょう。
これは、本来はエラーになるべきだと思います。echo 1+"A";とかだと、一応警告メッセージは出ますね。このあたりの不統一はPHPらしいところです。

理由は、Perl由来、おそらくもともとは、Cのatoi関数の仕様から来ていると思います。現在のCの場合は、ちゃんとした解析にはstrtol等を使うということで、atoiは簡易版という位置づけだと思います。

投稿2019/03/26 05:34

otn

総合スコア84499

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

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

WeilSpinor

2019/03/26 05:45 編集

ご回答ありがとうございます。 "任意の"文字列が、というのに語弊がありましたね。 私が例にあげた文字列が限定的すぎました。 文字列"810"は810に、 文字列"810先輩"は810に、 文字列"野獣先輩"は0に、 文字列"先輩810"は0に、 それぞれ変換する、という感じで覚えようと思います。
WeilSpinor

2019/03/26 05:47

歴史的などの関係なんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問