unserialize

保存用表現から PHP の値を生成する

説明

mixed unserialize(string $data, array $options = [])

unserialize は、シリアル化された変数を PHP の値に戻す変換(アンシリアライズ)を行います。

警告

allowed_classesoptions の値にかかわらず、 ユーザーからの入力をそのまま unserialize に渡してはいけません。 アンシリアライズの時には、オブジェクトのインスタンス生成やオートローディングなどで コードが実行されることがあり、悪意のあるユーザーがこれを悪用するかもしれないからです。 シリアル化したデータをユーザーに渡す必要がある場合は、安全で標準的なデータ交換フォーマットである JSON などを使うようにしましょう。 json_decode および json_encode を利用します。

外部に保存されているシリアル化されたデータをアンシリアライズする必要がある場合は、 hash_hmac を使ったデータの検証を検討しましょう。 他者によるデータの改ざんがないことを確かめるためです。

パラメータ

data

シリアル化された文字列。

もしアンシリアライズする変数がオブジェクトの場合、 オブジェクトが無事再作成された後、PHP は自動的にメンバ関数 __unserialize() または __wakeup() (存在していれば) をコールしようとします。

注意: unserialize_callback_func ディレクティブ

unserialize_callback_func ディレクティブで指定したコールバックは、未定義のクラスをアンシリアライズしようとした場合にコールされます。 コールバックが指定されない場合は、__PHP_Incomplete_Class がインスタンス化されます。

options

unserialize に連想配列で渡すオプション。

有効なオプション
名前 説明
allowed_classes mixed 受け付けるクラス名の配列を指定します。あらゆるクラスを拒否する場合は false、あらゆるクラスを受け付ける場合は true を指定します。 このオプションを指定しているときに、もし unserialize が受け付け対象外のクラスのオブジェクトに遭遇すると、 そのオブジェクトを __PHP_Incomplete_Class のインスタンスに変換します。 このオプションを省略すると、true を指定したのと同じ意味になります。 つまり、PHP はあらゆるクラスのオブジェクトをインスタンス化しようとします。
max_depth int アンシリアライズ処理の間に許される、 データ構造の再帰の深さの最大値を設定します。 これは、スタックオーバーフローを防ぐためのものです。 デフォルトの深さの最大値は 4096 であり、 0 に設定すると、 この制限を無効にすることができます。

戻り値

変換された値が返されます。その値は、 bool, int, float, string, array, object のいずれかとなります。

渡された文字列が復元できなかった場合、false を返して E_WARNING を発生します。

エラー / 例外

オブジェクトは、 アンシリアライズを実行するハンドラで Throwable をスローしても構いません。

変更履歴

バージョン 説明
8.3.0 渡された文字列が復元できない場合、 E_WARNING が発生するようになりました。 これより前のバージョンでは、E_NOTICE が発生していました。
7.4.0 optionsmax_depth が追加されました。 これは、アンシリアライズ処理の間に許される、 データ構造の再帰の深さの最大値を設定するものです。
7.1.0 optionsallowed_classes 要素は、 型を厳密に調べるようになりました。 つまり、array または bool 以外の型が与えられると、 unserialize 関数は false を返し、 E_WARNING レベルの警告を発生させます。

例1 unserialize の例

<?php
// ここで、データベースから $session_data にセッションデータをロード
// するために unserialize() を使用します。
// この例は、serialize() で記述された例を補足するものです。

$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare($conn, "SELECT data FROM sessions WHERE id = ?");
$sqldata = array($_SERVER['PHP_AUTH_USER']);
if (!odbc_execute($stmt, $sqldata) || !odbc_fetch_into($stmt, $tmp)) {
    // 実行または取得が失敗した場合、空の配列で初期化します
    $session_data = array();
} else {
    // tmp[0] にシリアル化されたデータを保持している必要があります。
    $session_data = unserialize($tmp[0]);
    if (!is_array($session_data)) {
        // 何か問題があったため、空の配列で初期化します。
        $session_data = array();
    }
}
?>

例2 unserialize_callback_func の例

<?php
$serialized_object='O:1:"a":1:{s:5:"value";s:3:"100";}';

ini_set('unserialize_callback_func', 'mycallback'); // 独自のコールバック関数を設定する

function mycallback($classname) 
{
    // クラスが定義されているファイルをインクルードするだけです。
    // どのクラス定義が必要になるのかを $classname で判断します。
}
?>

注意

警告

エラーやシリアライズされた false 値をアンシリアライズする場合、 false が返されます。この特殊なケースは dataserialize(false) で比較する、もしくは E_NOTICE をキャッチすることで区別することができます。