home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

PHP/Tips/20060304/OSの判定とSmartyのdate_formatの罠

PHP/Tips/20060304/OSの判定とSmartyのdate_formatの罠

PHP / Tips / 20060304 / OSの判定とSmartyのdate_formatの罠
id: 59 所有者: msakamoto-sf    作成日: 2006-03-04 23:19:17
カテゴリ: PHP 

OSの判定方法

何種類か出てくると思います。

DIRECTORY_SEPARATORでざっくりと分類する方法

Windowsとそれ以外でざっくりと分類するのであれば、DIRECTORY_SEPARATORが"/"か"\"かで見分けても問題ないかなと思います。

PATH_SEPARATORで見分けても良さそうですが、PATH_SEPARATORはPHP4の古いバージョンだと未定義だったりします。昔のPHPコードを見てると、むしろDIRECTORY_SEPARATORからPATH_SEPARATORの定義を切り分けてたりします。

if (!defined('PATH_SEPARATOR')) {
    if ('/' == DIRECTORY_SEPARATOR) {
        // UNIX系
        define('PATH_SEPARATOR', ':');
    } else {
        // Windows
        define('PATH_SEPARATOR', ';');
    }
}

"OS"環境変数 or PHP_OS定数から見分ける方法

具体的にOS名を取得したい場合は環境変数の"OS"から見分けても良いと思います。PHP_OSという定数も定義済です。環境変数の方が若干細かいようですので、用途に合わせてという感じです。

> php -r "echo getenv('OS');"
Windows_NT
> php -r "echo PHP_OS;"
WINNT

Mac OS X 以降でのOS判定間違いコード

PHP_OSなどからWindowsか否かを判定する場合、Mac OS X が出現する前は次のようなコードでも問題有りませんでした。

if (false != strpos('win', strtolower(PHP_OS))) {
...
}

しかしMac OS Xの場合はOS名に"Darwin"と入るようですので、上記コードだとOSXまでWindowsだと勘違いされます。
Smartyのコードからの拝借ですが、次のように「先頭から3文字」を取得して比較するのが安全だと思われます。

if (substr(PHP_OS,0,3) == 'WIN') {
...
}

Smartyのdate_formatの罠

Smartyのdate_formatの %Y %D の指定がなんか変に感じたので、試しにソースを当たってみたら

if (substr(PHP_OS,0,3) == 'WIN') {
    $_win_from = array ('%e',  '%T',       '%D');
    $_win_to   = array ('%#d', '%H:%M:%S', '%m/%d/%y');
    $format = str_replace($_win_from, $_win_to, $format);
}

Windowsの場合勝手に変換してくれてるようです。date_formatでは%Dを %m/%d/%y にしちゃう。(実際にフォーマットしているstrftime()自体がそういう仕様)なので、短くかけてラッキーと思っていたら、%y/%m/%dじゃなくてちょっと残念だった。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2008-12-22 23:33:57
md5:b3fa9cc2eb4d1d88a9e38171c6f582b0
sha1:52e34715bcac3d4481681b3bdc3ab8de3b834372
コメント
コメントを投稿するにはログインして下さい。