« 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;

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

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

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