刹那(せつな)の瞬き

Willkömmen! Ich heiße Setsuna. Haben Sie etwas Zeit für mich?

PHPの勉強でハマった事

現在、PHPを勉強するため、Mac上に開発環境を構築してます。
Mac OS X Lion 10.7.4 (Xcode 4.2.1)
・apache2 (2.2.21: OS標準:/usr/sbin/httpd)
・php5 (5.3.10: OS標準:/usr/bin/php)
・MySQL55 (5.5.25: MacPorts:/opt/local/lib/mysql55/bin/mysqld)
NetBeans 7.1.2

NetBeansのおかげで効率良くソースを書くことができ、動作確認も簡単です。
動かない例題もあったけど、工夫して何とかこなしてます。
そんな便利な環境なのですが、うっかりハマって悩んだ事が2つあります。

1. DateTime()のタイムゾーンによる影響

現在の時刻を取得する場合、

$now = new DateTime();

とシンプルに記述できるのですが、これがFatal errorになります。
理由は、PHP5.3からタイムゾーンの取得に関して仕様変更があったようです。
Mac OS Xのターミナルから確認すると、環境変数TZは存在しません。
/etc/php.iniの[date]セクションもコメントのままです。なので、

[date]
date.timezone='Asia/Tokyo'

のように、既定のタイムゾーンを指定しておけば、期待通りに動作します。

2. preg_match()の正規表現

※ここから先はLion以降でないと正しく表示されません。

エスケープ文字を表現するのに、'\'(バックスラッシュ)を用います。
Windows環境が長かった僕は、'¥'(円記号)で代替するものだと思ってました。
※もし、'\'と'¥'が同じ表示に見えてるなら、この問題は発生しません。

NetBeansも初期状態はShiftJISなので、普通に常識の範囲かと。

preg_match('/^¥w{3,20}$/', $user_name)

これで、$user_nameが3〜20文字に収まるが確認できるのハズなのですが…
$user_nameに何を与えても、まったくマッチしません。

OS標準のPHPの不具合なの?と悩みましたが、MacWindowsじゃないもの。
ウムラウトが[option]キーで入力できるなら、もしかして…
やっぱり、バックスラッシュも[option]+[¥]で入力できます!

'¥'をバックスラッシュに変更したら、今度は正常動作しました。
Encodingでハマったのは初めてかも。
UTF-8とShiftJISの混合が多くなるので、新しいOSでは注意しなきゃ。

(追記)
手持ちのOSとブラウザの組合せを全部試したら、この状態はLionだけだった。
この記事はLionのFirefoxで修正してるんだけど、ちゃんと区別されてるなぁ。