« 2005年06月 | メイン | 2007年05月 »
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) | トラックバック
2005年08月15日
時間の取得
時間の取得方法は色々あります。目的に応じて使い分けてみよう。
■年月日時を取得
date関数を使ってみる。
例1
print date("Y-m-d H:i:s");
結果例1
2005-08-15 20:30:25
例2
print date("Y年m月d日 H時i分s秒");
結果例2
2005年08月15日 20時30分25秒
このように、フォーマットを自由にできる。
曜日も出力できるが、英語となる。
日本語の曜日を出力したい場合は、strftime関数を使う。
例
setlocale (LC_TIME, "ja_JP");
print strftime ("%Y年%m月%d日(%a) %H時%M分%S秒");
結果例
2005年08月15日(月) 20時30分25秒
上記のsetlocaleが使えないサーバーの場合、曜日変換ルーチンを組む。
$youbi = array('日','月','火','水','木','金','土');
$time = time();
print date("Y年m月d日(".$youbi[gmdate("w",$time)].") H時i分s秒", $time);
結果例
2005年08月15日(月) 20時30分25秒
time関数は、UNIX時(1970年1月1日)からの秒数を得ます。
■海外サーバーの場合
gmdate関数を使い、グリニッジ標準時を得ます。
使い方はdate関数を同じです。
例
print gmdate("M d Y H:i:s", time()+9*60*60);
日本は、GMT+9なので、9時間を足すと日本時間となります。
■応用:ファイルの日付と現在の日付の差を取得する
$Diff = (time() - filemtime($filename))/60/60;
$Diffには、ファイルが作られてから何時間経過したかが入ります。
日数の差を求める場合 /24 を追加。
$Diff = (time() - filemtime($filename))/60/60/24;