[ PHP ] 拡張モジュールや関数の存在確認 ( extension_loaded / function_exists )

Pocket

作成する PHP プログラムが拡張モジュールを使用している場合、拡張モジュールが有効ではない環境ではプログラムが正常に動作しないことになります。また、あるバージョンで追加された関数などを使用している場合には古いバージョンの PHP では正常に動作しません。

スポンサーリンク

そのため、プログラム内では事前に使用する拡張モジュールが有効であるか確認しておいたほうが、 ユーザーが原因の把握および対処する際に役立ちます。開発環境構築手順書等が用意されていない場合などは、開発者側にも有効な手段にもなります。それはそれで問題ですが。

拡張モジュールが有効であるか確認

mcrypt および openssl モジュールが有効となっているかを extension_loaded 関数を使用して確認するサンプルコードになります。

    // mcrypt モジュール確認
    if(!extension_loaded('mcrypt')) {
        throw new Exception("mcrypt 拡張モジュールが有効なっていません。");
    }

    // openssl モジュール確認
    if(!extension_loaded('openssl')) {
        throw new Exception("openssl 拡張モジュールが有効になっていません。");
    }

PHP 5.3 では Windows 版バイナリには MCrypt ライブラリが スタティックに組み込まれているので、 拡張モジュールは不要です。php.ini の extension にも php_mcrypt.dll はコメントアウトされた状態になっていますが、DLL は存在していません。

関数が存在するか確認する

PHP には、Javascript のように呼び出したい関数が存在するかを function_exists 関数を使用して確認することができます。これは、フレームワークやライブラリなどの開発においてサポートする PHP のバージョンに幅がある場合に有用です。

例えば json 形式の値をデコードする場合、json_decode 関数は PHP5.2 以降でサポートされ、 json_last_error 関数は PHP5.3 以降でサポートされています。このような場合は、関数の存在を確認し、処理の分岐を行い各バージョンに対応することができるようになります。サポートされているものはできる限り独自実装ではなく、用意されているものを使用したほうが良いでしょう。

    // php バージョン 5.2 以上
    if (function_exists('json_decode')) {
        $decode = json_decode($encodedValue);

        // php バージョン 5.3 未満 
        if (!function_exists('json_last_error')) { 
            if ($decode === $encodedValue) { 
                throw new Exception('Decoding failed'); 
            } 
        // php バージョン 5.3 以上
        } elseif (($jsonLastErr = json_last_error()) != JSON_ERROR_NONE) { 
            switch ($jsonLastErr) {
                case JSON_ERROR_DEPTH:
                    throw new Exception('Decoding failed: Maximum stack depth exceeded');
                case JSON_ERROR_CTRL_CHAR:
                    throw new Exception('Decoding failed: Unexpected control character found');
                case JSON_ERROR_SYNTAX:
                    throw new Exception('Decoding failed: Syntax error');
                default:
                    throw new Exception('Decoding failed');
            }
        }
    } else {
        // php < 5.2

        /*
         * 自前でデコード処理を行う
         */
        $decode = '自分でデコード処理';
    }

私であれば、サポートするバージョンを減らし独自の実装をなくす選択をするでしょう

参考

 

スポンサーリンク


Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>