home Glamenv-Septzen(ぐらめぬ・ぜぷつぇん)(archive)

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

作成日: 2006-03-04 23:19:17   /   last updated at: 2008-12-22 23:33:57
カテゴリ: 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じゃなくてちょっと残念だった。


original url: https://www.glamenv-septzen.net/view/59