« 2005年08月15日 | メイン | 2007年05月19日 »

2005年08月17日

型の自動変換

phpでは、臨機応変に自動キャストされた値が関数等へ渡されます。
しかし、これが行われない場合もあるので注意しよう。
ちなみに、自動キャスは渡した命令内でのみ有効であり、元の変数を変える物ではありません。

■便利な自動キャスト

$n = 1;
print $n;

$nはint型で、値は1となります。
printが実行されるとき、$nは自動で文字列型に変換されて処理されます。

$n = "1";
#m = $n + 2;

$nは、文字列型で、値は"1"となります。
次の行では、数値演算が行われるので、$nはこのとき自動的に数値型へ変換されます。

$n = "1dayo";
if ($n == 1) ...........;

$nは、文字列型で、値は"1"となります。
if文では、$nを自動的に数値として処理するため、$nの値は1となります。
数値以外の文字は、nullとなります。

$n = "koreha1dayo";
if ($n == 1) ...........;

上の場合、$nを数字型へ自動変換されたif文での値は 0 です。
値が文字列から始まっており、その文字がnullへ変換されたため、途中の1はきえてしまいます。
したがって、このif文は false です。

このようにして、単純な場合は自動的に型の変換が行われます。
しかし、複雑な文字列処理を行った後、文字列型の変数を自動で数値型に変換してくれない場面もある。
それは、値の中に空文字が含まれている場合です。上のif文の処理と同じになります。
str_replaceなどで、文字列の一部を空文字へ変換した場合は注意しよう。
この場合、自動変換はうまく行われません。なので、明示的に変換する必要があります。
変換は、たとえば settype($n, "integer"); を使えばいいでしょう。
この変換では、数字以外の文字は完全に消去されます。

■print文と配列
配列は、たとえば、$hoge['abc'] = "値"; のように定義すとする。
通常、配列のキーは''や""で囲むことになっている。
しかし、phpでは型の自動変換機能により、囲まなくても大抵は動作する。
[]の中身が、変数でも関数でも定数でも無い場合、ただの文字列として処理される。
あくまで大抵であり、文字列によっては誤動作することを覚えておこう。

この配列を、print文などで出力すとき、初心者は一つ注意することがある。
print "$hoge['abc']";
とした場合、これは print $hoge[''abc'']と展開され、文法エラーとなる。
正しくは
print "$hoge[abc]";
となる。
""や''は、その中身が文字列だということを知らせる物である。
なので、文字列という指定を重複させてはならない。

常に型を意識してプログラミングを行おう。

投稿者 Nori : 11:39 | コメント (0) | トラックバック

空文字とヌル(NULL)の代入

空文字の代入とは

$n = "";

のように、空の文字(\0)を代入することで、NULL文字ともよびます。
NULLの代入は、

$n = null;

のように、直接NULLを代入することです。

以上の2つは、一件同じようですが、少し違います。
前者の$nは、文字を代入したことになるので、文字列型の変数となります。
後者は、型無しのNULLを代入したことになるので、その変数は存在しなくなります。

両者の動作は、場合によっては違ってくるので注意が必要です。

$n = "";
if ($n == null) echo "\$nはnullです。"
if (!isset($n)) echo "\$nはnullではありません。"

上のif文は、両方ともtureとなります。
isset関数は、変数が存在するかどうかを調べる関数です。
一見矛盾しているようですが、これは、if文がnullを自動的にnull文字へ変換してるからです。

したがって、変数が存在するか確認をするときに isset() を使う場合は、空文字の可能性を考慮しなければなりません。
空文字が入る可能性があるとき、isset()を実行する前に、空文字の変数にnullを代入するよう処理が必要となります。
これらの手間を省くには、empty() が適切です。
empty()は、変数が「空文字」「0」「NULL」「空配列」「false」と、いった値全てに対してtureを返します。

では、変数にNULLを代入した場合はどうでしょう。

$n = null;
if ($n == "") echo "\$nは空文字です。"
if ($n == null) echo "\$nはnullです。"
if (!isset(\n)) echo "\$nは存在しません。";

上の式は、実行できません。最初のif文でエラーとなります。
これは、存在しない\nを扱おうとしているためです。
同様にして、2番目も実行できません。
唯一3番目は実行でき、!isset()はtrueとなります。変数 \n は存在しないという意味です。

複雑な文字処理を行う場合、これらの扱いを間違い、バグを生みやすいので注意しよう。

投稿者 Nori : 10:59 | コメント (0) | トラックバック

| ウェブマイスタートップ | ホームページの作り方 | スタイルシート入門 | PHP Tips | PHP配布 | 掲示板 | ブログ | ショッピング | リンク集 | 支援ウェブアプリ |

全ページへのリンク自由です。好きなページへ自由にリンクしてください。 © 2003 - 2008 ウェブマイスター