tetsunosukeのnotebook

tetsunosukeのメモです

OSの判定(PEARハック)

レンタルサーバとか、PEARのライブラリが入っていなかったり、include_pathが現在どうなっているか良く分からないときに、

define('ADDITIONAL_INC_PATH','/path/to/mylib');*1

define('PATH_DELIMITER', ':'); //for unix
//define('PATH_DELIMITER', ';'); //for windows


ini_set('include_path' ,
    ini_get('include_path') . PATH_DELIMITER . ADDITIONAL_INC_PATH);

ってな感じで書いていて、PATH_DELIMITERの部分を開発環境のWindowsと、実際に動作すると思しきUNIXとでコメントアウトを変えていたんだけども、ちょっとめんどっちいなと前々から思っていた。*2

今日機会があって、PEARのソースをたらたら眺めていたんだけども、もともとPEARにはOS_Guess*3ってクラスがあって、それを使えば取得できることは知ってた。でもそれってなんだか仰々しい。

ってことでだーっと中身を見ていたらPEAR.php

if (substr(PHP_OS, 0, 3) == 'WIN') {
    define('OS_WINDOWS', true);
    define('OS_UNIX',    false);
    define('PEAR_OS',    'Windows');
} else {

な部分を発見。なるほどー。PHP_OSっていう定数があるのか!以下で検証。間違いない。

<?php
    echo PHP_OS;
?>

かといって先頭三文字がWINと等しいとかめんどっちいから上記のこのコードはPEAR.phpをrequire_onceすればラクチン!OS_WINDOWSっていう定数が設定されるからそれを使って自分で

$path_delim = OS_WINDOWS ? ';' : ':';

とかすればいいや、やった!とか思っていたら。もっと読んでみたら、そいつを使ってこんなこともしてるじゃないの!

// instant backwards compatibility
if (!defined('PATH_SEPARATOR')) {
    if (OS_WINDOWS) {
        define('PATH_SEPARATOR', ';');
    } else {
        define('PATH_SEPARATOR', ':');
    }
}

これで自分のコードは今後こうなることになりました。*4

require_once 'PEAR.php';

define('ADDITIONAL_INC_PATH','/path/to/mylib');


define('PATH_DELIMITER', ':'); //for unix
//define('PATH_DELIMITER', ';'); //for windows


ini_set('include_path' ,
    ini_get('include_path') . PATH_SEPARATOR . ADDITIONAL_INC_PATH);

とりあえずPATH_DELIMITERって名前が違ってちょっと残念でした、とかいう。

*1:ADDITIONAL_INC_PATHを配列対応しろって話があるんですがおいといて

*2:実際はset_include_pathっていう関数があるんでそれ使えって話であることが後にわかる

*3:ドキュメントURLないみたい。。。

*4:ちなみに、最初のPEAR.phpを読み込んでいるところなんですが、通常PEARを拡張したライブラリ(DBとか)を読んでるので、実際は不要だったりする。あってもrequire_onceなので問題にはならないけど。