php
10=='ANY';//true
この仕様の理由・目的って何ですか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
Perlに影響を受けた結果の仕様だと思います。
PHPには、Perl由来の仕様が多くあります。文末;
とブロックの{}
という基本的な事は他の言語でも見られますが、変数が$
から始まるという所や文字列結合は.
を使う所などはPerlとPHP以外ではあまり見られない特徴です。それと同じで、==
の仕様もなるべくPerlに似たような動作をしようとしたのだと思われます。
Perlの$
がついている変数はスカラー変数というもので、他の言語とは少し考えが違います。スカラー変数には数値や文字列を入れることができるのですが、文脈によって数値にも文字列にもあつかえるというものです。$x = 1;
と$y = "1";
があったとき、二つに違いは(実際はあるのですが)ほぼないと言ってもいいような作りになっています。ここら辺は、変数をすべて文字列としてか扱えないシェルの影響かも知れません。"1" + "1"
が2
になるのも、1 . 1
が"11"
になるのも、数値と文字列を厳密に区別するほか言語からするととても驚くことです。PHPはこのPerlの仕様を多く採用してしまったと考えられます。
Perlでは==
は「数値として比較」の意味でした。先ほども言ったとおり、Perlではスカラー変数が数値だったか文字列だったかはあまり関係が無く、文脈として「数値として」を足す必要があったのです。PHPは、Perlに似せようとしましたが、PHPの変数はスカラー変数のような曖昧さを持たず、数値と文字列は厳密に区別され、文脈によって型の解釈が変わるという作りではありません。文字列同士なら文字列同士として比較したい、けど、片方が数値なら、Perlのように動かしたい、そんなジレンマが、このちぐはぐな仕様を生んだのだと思います。
この曖昧な==
がある他の言語はJavaScriptぐらいです。作られた時期はPHPとほぼ一緒であるため、JavaScriptが何を思ったのかまではわかりません。
投稿2017/11/16 10:10
総合スコア21735
0
ベストアンサー
http://php.net/manual/ja/language.operators.comparison.php
整数値を文字列と比較したり、比較に数値形式の文字が含まれる場合は、文字列が 数値に変換され、 数値としての比較を行います。
http://php.net/manual/ja/language.types.string.php#language.types.string.conversion
文字列の最初の部分により値が決まります。文字列が、 有効な数値データから始まる場合、この値が使用されます。その他の場合、 値は 0 (ゼロ) となります。
0=='ANY'
は左辺が数値/右辺が文字列ですから、まず文字列'ANY'
が数値0
へと変換され、0==0
により真偽値true
が得られます。
正確な理由は知りませんが、PHP言語の哲学ではこのような振る舞いが"便利"だと考えられるのでしょう。
投稿2017/11/16 09:39
総合スコア6191
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/16 09:53
2017/11/16 10:09
2022/02/04 05:30
0
文字列から数値のキャストは1文字目から順に数字を探していき、
先頭文字がスペース等の空白文字だった場合は探索を継続しますが、数字以外が出た時点で探索打ち切り。
1文字目がそもそも数値以外の文字だった場合は0として取り扱う仕様です。
私はPHPの作者じゃないので意図を説明しろと言われてもわかりませんが、
多分こう言いたいのだと思います。
PHP作者「だって"10h"
を10
って評価したいじゃん!ルール決めしたらこうなった!」
"10hours"
という文字列は10
という数値に変換されます。
1文字も数値がなければ0
になります。(おかしいだろ1個目)
"number_of_7"
を数値にキャストすると0
になります。(おかしいだろ2個目)
この辺の型変換周りの動作は言語毎に実装揺れがありますし、
PHP以外のあんな言語やこんな言語も想定外の糞挙動は結構あります。
この辺の仕様はPHPマニュアルに載ってます。
投稿2017/11/16 09:39
編集2017/11/16 09:50総合スコア21158
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/16 10:18