PHPコーディング
PHPの変数型
2010年02月17日
PHPは変数を使うとき、型を宣言しません。
文字列を代入すれば文字型の変数に、数値を代入すれば数値型の変数になります。
そう、PHPが自動的に型を決めてくれるのです。
同様に、変数の値の比較の際も、自動で型を変換してしまいます。
(文字型と数値型の比較もできてしまうのです。)
しかし、この文字型と数値型の比較で驚くことがおこります。
$test = 0;
if($test == ""){
通ります。
}
$test = "1a";
if($test == 1){
通ります。
}
$test = "a1";
if($test == 0){
通ります。
}
恐ろしいことです。
文字型と数値型を比較するときは、文字型変数の値が数値に(勝手に)変換されてから比較されるので、こんな摩訶不思議なことが起こってしまうのです。
http://www.php.net/manual/ja/language.operators.comparison.php
http://www.php.net/manual/ja/language.types.string.php#language.types.string.conversion
更なる自動変換の数々
http://d.hatena.ne.jp/gallu/20061108/p1
http://techblog.ecstudio.jp/tech-tips/php-string-compare.html
こうした自動変換による不思議な世界は【switch】にも広がっています。
文字列比較のときは、【===】か【strcmp】を使うようにとあります。
$test = 0;
if($test === ""){
通りません。
}
$test = "1a";
if($test === 1){
通りません。
}
$test = "a1";
if($test === 0){
通りません。
}
ここで、【===】と【strcmp】の速度について調べてみました。
for($cnt=0; $cnt<10000000; $cnt++){
$test1 = "abc";
$test2 = "def";
if(strcmp($a, $b) === 0){
}
}
for($cnt=0; $cnt<10000000; $cnt++){
$test1 = "abc";
$test2 = "def";
if($a === $b){
}
}
この2つのループにかかる時間を計ったところ、【===】判定のほうがはるかに早かったです(何回か実行しました)。
【===】演算子は型変換を行わないので、処理が早いのだそうです。
しかし、【switch】では【if】のような演算子は使えません。
変数の比較(特に文字列)では、【if】文で【===】と【!==】を用いる、のが安全なようです。
文字列を代入すれば文字型の変数に、数値を代入すれば数値型の変数になります。
そう、PHPが自動的に型を決めてくれるのです。
同様に、変数の値の比較の際も、自動で型を変換してしまいます。
(文字型と数値型の比較もできてしまうのです。)
しかし、この文字型と数値型の比較で驚くことがおこります。
$test = 0;
if($test == ""){
通ります。
}
$test = "1a";
if($test == 1){
通ります。
}
$test = "a1";
if($test == 0){
通ります。
}
恐ろしいことです。
文字型と数値型を比較するときは、文字型変数の値が数値に(勝手に)変換されてから比較されるので、こんな摩訶不思議なことが起こってしまうのです。
http://www.php.net/manual/ja/language.operators.comparison.php
http://www.php.net/manual/ja/language.types.string.php#language.types.string.conversion
更なる自動変換の数々
http://d.hatena.ne.jp/gallu/20061108/p1
http://techblog.ecstudio.jp/tech-tips/php-string-compare.html
こうした自動変換による不思議な世界は【switch】にも広がっています。
文字列比較のときは、【===】か【strcmp】を使うようにとあります。
$test = 0;
if($test === ""){
通りません。
}
$test = "1a";
if($test === 1){
通りません。
}
$test = "a1";
if($test === 0){
通りません。
}
ここで、【===】と【strcmp】の速度について調べてみました。
for($cnt=0; $cnt<10000000; $cnt++){
$test1 = "abc";
$test2 = "def";
if(strcmp($a, $b) === 0){
}
}
for($cnt=0; $cnt<10000000; $cnt++){
$test1 = "abc";
$test2 = "def";
if($a === $b){
}
}
この2つのループにかかる時間を計ったところ、【===】判定のほうがはるかに早かったです(何回か実行しました)。
【===】演算子は型変換を行わないので、処理が早いのだそうです。
しかし、【switch】では【if】のような演算子は使えません。
変数の比較(特に文字列)では、【if】文で【===】と【!==】を用いる、のが安全なようです。
コメント