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

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

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

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

Q&A

解決済

3回答

1355閲覧

0=='ANY';//true

KazuhiroHatano

総合スコア7804

PHP

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

0グッド

0クリップ

投稿2017/11/16 09:24

php

10=='ANY';//true

この仕様の理由・目的って何ですか?

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

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

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

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

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

guest

回答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

raccy

総合スコア21735

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

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

KazuhiroHatano

2017/11/16 10:18

回答ありがとうございます なるほど、perlの型の曖昧さの遺物といった感じのものといったところですね javascriptも、ゆるいですよね、PHP以上じゃないかと思ってます
guest

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

yohhoy

総合スコア6191

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

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

KazuhiroHatano

2017/11/16 09:50

回答ありがとうございます 数値に変換できない文字列について数値に変換しようとすれば NaNとなるものだと思っていたので 意外な振る舞いをされて戸惑ってしまいました PHPはエラーを起こしてバグを伝えるよりは 「止まらないこと」の方を優先している ということなのでしょうかね
yohhoy

2017/11/16 09:53

このPHP言語特有の型変換は ”Type Juggling" と呼ばれるみたいです。検索してみると、結構嫌われてるみたいですね(私も違和感バリバリ派ですががが)
KazuhiroHatano

2017/11/16 10:09

他言語での経験からNaNエラーを起こさないために 先に型チェックなり、変換可能チェックなりするクセがあったために 今のいままでこの仕様に気づきませんでした Type Jugglingと言うのですね いい勉強になりました
guest

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
miyabi-sun

総合スコア21158

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

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

KazuhiroHatano

2017/11/16 09:58

回答ありがとうございます PHPは多分一番長く触っている言語なんですが いまだに解せないゆるさが多いです…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問