no-image

PEARパッケージが存在するかどうかチェックする

例えば配布アプリケーションなどでPEARを使っていて、かつPEARを同梱していない場合、アプリケーション側でPEARがインストールされているかどうかチェックしたい時があります。

そんな時はおもわず


//DB_DataObjectがなかったらfalse
if (!file_exists('DB/DataObject.php')) {
    return false;
}

とか書きたくなりますが、このコードだと、カレントに配置していない限りfalseが返ります。

file_existsはinclude_pathを参照しないため、include_pathで指定されたディレクトリに含まれるファイルは検出できないのです。

そこで、Ethnaの場合include_pathを含めてファイルの存在確認を行ってくれるfile_exists_ex関数があるのでこれを使う事で適切に(先ほどの例では)DB_DataObjectが存在するかどうかを調べることができます。


//DB_DataObjectがなかったらfalse
if (!file_exists_ex('DB/DataObject.php')) {
    return false;
}

このfile_exists_exはEthna上で使われる便利関数を集めたEthna_Utilクラスにグローバル定義されているので、Ethnaを使っていない場合でも以下の部分をコピペすることで使えるようになります。


// {{{ file_exists_ex
/**
 *  グローバルユーティリティ関数: include_pathを検索しつつfile_exists()する  *
 *  @param  string  $path               ファイル名
 *  @param  bool    $use_include_path   include_pathをチェックするかどうか
 *  @return bool    true:有り false:無し
 */
function file_exists_ex($path, $use_include_path = true)
{
    if ($use_include_path == false) {
        return file_exists($path);
    }
    // check if absolute
    if (is_absolute_path($path)) {
        return file_exists($path);
    }
    $include_path_list = explode(PATH_SEPARATOR, get_include_path());
    if (is_array($include_path_list) == false) {
        return file_exists($path);
    }
    foreach ($include_path_list as $include_path) {
        if (file_exists($include_path . DIRECTORY_SEPARATOR . $path)) {
            return true;
        }
    }
    return false;
}
// }}}
// {{{ is_absolute_path
/**
 *  グローバルユーティリティ関数: 絶対パスかどうかを返す
 *
 *  @param  string  $path               ファイル名
 *  @return bool    true:絶対 false:相対
 */
function is_absolute_path($path)
{
    if (OS_WINDOWS) {
        if (preg_match('/^[a-z]:/i', $path) && $path{2} == DIRECTORY_SEPARATOR) {
            return true;         }
    } else {
        if ($path{0} == DIRECTORY_SEPARATOR) {
            return true;
        }
    }
    return false;
}
// }}}

PEARをガンガン使ってアプリケーションを開発していると他の環境に持っていった時に動かないということがよくあるのでそんなときにはこのfile_exists_ex関数をEthnaから借りて使ってみてはいかがでしょうか?