2006-11-08
■[言語][プログラミング][PHP]素晴らしき自動的な世界〜或いは「型のない」世界〜
昼の激闘が嘘のような。あるいはその激闘を癒し包むかのような真夜中の静寂。
初冬ともいえるこの時期の冷たい風が、激務に火照った体をゆっくりと静めてくれる。ほんの一瞬の、至福な時。
その永遠の如き静けさを引き裂くかのように。
そのメールは不意にやってきた。
PHP驚愕の事実
if ('2a' == 2) {
ここ通る
}
………まてやこら。
あんまりの驚きに「ドラマ風」なスタートを切ってみましたがるです皆様いかがお過ごしでしょうか(まだテンションがおかしい)。
なんていうか…驚きですワンダーです冒険ですドラマですそんなネタまみれなプログラム言語イヤだい。
おいといて。
ちょっと実験をしてみました。
if ('2a' == 2) { // true
if ("2a" == 2) { // true
if ('a2' == 2) { // false
if ('a2' == 0) { // true
if ('22a' == 22) { // true
if ('022a' == 22) { // true
if ('-22a' == -22) { // true
if (' 2a' == 2) { // 先頭に空白 true
if (' 2a' == 2) { // 先頭にtab true
if ('\n2a' == 2) { // false
if ("\n2a" == 2) { // true
if ("0x10" == 16) { // true
if ("0x1a" == 26) { // true
if ("0123" == 83) { // false
if ("0123" == 123) { // true
………すんごいですねぇ。
ちなみに変数に代入した場合。
$a = 2;
$b = "2a";
if ($b == $a) { // true
で、
$a = 2;
$a = $a . "";
$b = "2a";
if ($b == $a) { // false
になります。
皆様はこの規則性見えますでしょうか?
答えはこちら。
http://www.php.net/manual/ja/language.operators.comparison.php
整数値を文字列と比較する際、文字列が 数値に変換されます。 数値形式の文字列を比較する場合、それは整数として比較されます。これらの ルールは、 switch 文にも適用されます。
……………………あのなぁ。
ちなみに「文字列が数値に置換される」ルールは
http://www.php.net/manual/ja/language.types.string.php#language.types.string.conversion
をご覧くださいませ。
文字列の変換
数値として文字列が評価された時、結果の値と型は次のように定義されます。
文字列は、'.'、'e'、'E' のどれかが含まれている場合は float、それ以外は整数として評価されます。
文字列の最初の部分により値が決まります。文字列が、 有効な数値データから始まる場合、この値が使用されます。その他の場合、 値は 0 (ゼロ) となります。有効な数値データは符号(オプション)の後に、 1 つ以上の数字 (オプションとして小数点を 1 つ含む)、 オプションとして指数部が続きます。指数部は 'e' または 'E' の後に 1 つ以上の数字が続く形式です。
つまり。
'2a'は2になり、'a2'は0になるわけです。ちなみに、タブ、空白、改行などは都合よく無視してくれることが、"\t2a"、" 2a"、"\n2a"などのテストにより明らかになっております。
ちなみに0xつけて16進数は理解するようですが、先頭0で8進数はサポートされておりませんのでご注意ください。
えと。世間様でよく「PHPは型のない言語」だとかなんとかいう風評が流されておりますが。とんでもハップンでございます。
PHPは、素晴らしく「型の厳密な」言語でございますっていうか「型を厳密にプログラマが意識しておかないといかん言語」でございます。
そうでなければ何故に gettype などという関数が用意されているとおっしゃるのでしょうか? is_int()が、is_string()が、用意されているとお思いでしょうか?
とりあえず。「文字列の比較」に==演算子使っちゃいけませぬ。
ド最低限===(=が三つ)か、冷静には、正規表現なり(重いけどね)strcmpなり(多分こっちが無難)を使いましょう。
…案外いい言語かも。「お勉強のため」には。
PHPでプログラミングされている諸氏(特にお仕事でプロとしてなさっている諸氏)。くれぐれも「型」をお忘れなき用に。
ちなみに「どっかのタイミングで適当に自動で変換(functionの引数とか一撃ですな)」してくださりやがりますので、そのあたりにもご注意を。
- phpで普通にif文書くのはやばい。
- http://d.hatena.ne.jp/teracc/20061224
- [セキュリティ]PHPでの入力値チェックのすり抜け
- http://d.hatena.ne.jp/harg/20061229
- http://d.hatena.ne.jp/gallu/20070516
- http://d.hatena.ne.jp/Hexa/20070528
- Yのほぼコード置場 - 素敵で不敵なPHP
- Unknown::Programming - PHPにおける文字列比較の2a問題
- Yet Another Diary - PHPの’==’は注意
- 文字列比較に==を使ってはいけない
- よくかむWeb系めも。 - 比較演算子
- がるの健忘録 - 規約
- [Mi]みたいなもの - continueとか文字列比較とか
- 酔いどれの徒然 - 同型同値比較の罠
- がるの健忘録 - おいちゃん好みのPHPのための20Tips
- Dr. Radialistからの便り - PHP
- ごまこーど - はじめてのぴーえいちぴー
- 47 http://d.hatena.ne.jp/JavaBlack/
- 17 http://www.phppro.jp/qa/213
- 12 http://d.hatena.ne.jp/JavaBlack/20061031
- 12 http://www.phppro.jp/news/210
- 11 http://search.yahoo.co.jp/search?fr=moz2-sp&ei=UTF-8&p=gallu
- 8 http://www.google.co.jp/search?hl=ja&q=gallu&btnG=Google+検索&lr=
- 7 http://q.hatena.ne.jp/1162199668
- 5 http://reader.livedoor.com/reader/
- 4 http://www.phppro.jp/qa/228
- 3 http://blog.livedoor.jp/ckklucks/