エントリー

インラインRSSがどうも動作しなくなったみたいなので、RSSへのリンク追加しました
このサイトに掲載されている作品を、無断で掲載・転載する事を禁止します。
Copyright 2007- C Powered By FC2 BLOG
!!18歳になってない人は見ちゃダメ!!
生きてるけど、今は家族のことを最優先中!
「くすぐりの塔」はキャンサーさんから作品が届き次第、ちゃんと更新していきます!
(今は公開させていただいた作品が手元に届いているすべてです)
ご連絡:キャンサーさん、何度かメール送っているから、ご返信くださ~い
2008/11/28(金)に投稿された記事
Cはセッションクッキーを覚えた!
仕事でも使うので良い機会だったというわけだ!!
そんなわけで、俺様は超繁忙期を乗り切ったぞ!まだちょっと続くけど。
今回、初めてPHPに触れてみて言語仕様の紐解きが簡単でビックリしたという感想も含めて、PHPのクセのようなものが見えてきた面白かったです。
仕様に関わる面白い事例として、基礎的な分岐命令であるifに関して、文字列比較の方式の選択に迷いました。
if($a == $b){ echo "aとbは同じだよ"; }
if($a === $b){ echo "aとbは同じだよ"; }
if( strcmp($a, $b) == 0 ){ echo "aとbは同じだよ"; }
上記、3通りが文字列比較として存在しますが、言語仕様としては以下のような挙動となります。
比較演算子==
値を比較(型は問わない)
比較演算子===
値を比較(型も比較)
比較関数strcmp
指定した2つの変数を文字列として比較
上記3通りの挙動は同じように見えますが、
◆比較演算子==では、以下の比較が通ってしまいます。
$a = "2x";
$b = 2;
if($a == $b){ echo "\$aと\$bは同じだよ"; }
【追記】2008.11.30 PHPでは比較演算子==で比較すると、
比較該当変数の型のどちらかが integer または floatの場合、かつ、先頭が数値と評価された場合、
文字列の数値と判別された範囲のみを取り出して比較しているようです。
◆比較演算子===では以下の比較が通りません(当然の挙動ではあるんですが・・・)。
$a = "2";
$b = 2;
if($a === $b){ echo "\$aと\$bは同じだよ"; }
これの何がマズいか言うと、変数に値を代入した時にphpが勝手に「型」を解釈してくれます。
その際、stringとして入れたつもりだったのに実はintegerになっていた、なんて事になると期待する結果が得られません。
10年飼っていた猫が、実は犬だったぐらいのショッキングさ加減です。これで初日にハマりました・・・
◆比較関数strcmpは変数に格納されている値を文字列として比較するため、上記のような誤作動は起こりません。
$a = "2";
$b = 2;
if(strcmp($a,$b) == 0){ echo "\$aと\$bは同じだよ"; }
【訂正】2008.11.29 式を間違えてたので修正しました
これが正しい挙動なのかどうかは、いささか疑問ですが割り切って使えば気になりません。
そんなこんなで、その他にも面白そうなワケの分からない挙動がいくつかあるので、今後も紐解いて行ってみたいと思ってまふ。
つまり俺様が何を言いたいのかと言うとPHPはサニタイズがめっちゃ楽っつー事です。
ぬー・・・Perlにもネイティブに同じ命令があればいいんじゃがのぅ・・・
そんなわけで、俺様は超繁忙期を乗り切ったぞ!まだちょっと続くけど。
今回、初めてPHPに触れてみて言語仕様の紐解きが簡単でビックリしたという感想も含めて、PHPのクセのようなものが見えてきた面白かったです。
仕様に関わる面白い事例として、基礎的な分岐命令であるifに関して、文字列比較の方式の選択に迷いました。
if($a == $b){ echo "aとbは同じだよ"; }
if($a === $b){ echo "aとbは同じだよ"; }
if( strcmp($a, $b) == 0 ){ echo "aとbは同じだよ"; }
上記、3通りが文字列比較として存在しますが、言語仕様としては以下のような挙動となります。
比較演算子==
値を比較(型は問わない)
比較演算子===
値を比較(型も比較)
比較関数strcmp
指定した2つの変数を文字列として比較
上記3通りの挙動は同じように見えますが、
◆比較演算子==では、以下の比較が通ってしまいます。
$a = "2x";
$b = 2;
if($a == $b){ echo "\$aと\$bは同じだよ"; }
【追記】2008.11.30 PHPでは比較演算子==で比較すると、
比較該当変数の型のどちらかが integer または floatの場合、かつ、先頭が数値と評価された場合、
文字列の数値と判別された範囲のみを取り出して比較しているようです。
◆比較演算子===では以下の比較が通りません(当然の挙動ではあるんですが・・・)。
$a = "2";
$b = 2;
if($a === $b){ echo "\$aと\$bは同じだよ"; }
これの何がマズいか言うと、変数に値を代入した時にphpが勝手に「型」を解釈してくれます。
その際、stringとして入れたつもりだったのに実はintegerになっていた、なんて事になると期待する結果が得られません。
10年飼っていた猫が、実は犬だったぐらいのショッキングさ加減です。これで初日にハマりました・・・
◆比較関数strcmpは変数に格納されている値を文字列として比較するため、上記のような誤作動は起こりません。
$a = "2";
$b = 2;
if(strcmp($a,$b) == 0){ echo "\$aと\$bは同じだよ"; }
【訂正】2008.11.29 式を間違えてたので修正しました
これが正しい挙動なのかどうかは、いささか疑問ですが割り切って使えば気になりません。
そんなこんなで、その他にも面白そうなワケの分からない挙動がいくつかあるので、今後も紐解いて行ってみたいと思ってまふ。
つまり俺様が何を言いたいのかと言うとPHPはサニタイズがめっちゃ楽っつー事です。
ぬー・・・Perlにもネイティブに同じ命令があればいいんじゃがのぅ・・・
投稿日:2008/11/29(土) 10:21:10
...ダメだ、Cさんが何を言っているのか全然わからんww
[このコメントを編集]