Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

PHP辞典

  1. トップページ
  2. PHP辞典
  3. serialize() / unserialize()

serialize() / unserialize()対応: PHP 4(2000)

PHPの値をバイト列に変換して保存・転送し、元の値に復元する関数です。セッションデータの保存やキャッシュに使用します。

構文
// 値をシリアライズして文字列に変換します。
serialize($value);

// シリアライズされた文字列を元の値に復元します。
unserialize($data, $options);
関数一覧
関数概要
serialize($value)PHP の値をバイト列の文字列に変換します。配列、オブジェクト、整数、文字列など、ほぼすべての型を変換できますが、リソース型とクロージャは変換できません。
unserialize($data, $options)シリアライズされた文字列を元のPHP値に復元します。第2引数の『allowed_classes』オプションで復元を許可するクラスを制限できます。
サンプルコード
<?php
// 配列をシリアライズします。
$data = ['name' => '太郎', 'age' => 25, 'skills' => ['PHP', 'JavaScript']];
$serialized = serialize($data);
echo $serialized; // シリアライズ形式の文字列が出力されます。

// シリアライズした文字列を復元します。
$restored = unserialize($serialized);
echo $restored['name']; // 『太郎』と出力されます。
print_r($restored['skills']); // 元の配列が復元されます。

// さまざまな型のシリアライズ結果を確認します。
echo serialize(42);        // 『i:42;』と出力されます。
echo serialize(3.14);      // 『d:3.14;』と出力されます。
echo serialize("PHP");     // 『s:3:"PHP";』と出力されます。
echo serialize(true);      // 『b:1;』と出力されます。
echo serialize(null);      // 『N;』と出力されます。

// オブジェクトのシリアライズです。
class UserData {
	public function __construct(
		public string $name,
		public string $email
	) {}
}

$user = new UserData("花子", "hanako@example.com");
$serialized_user = serialize($user);
echo $serialized_user;

// 安全なunserialize: allowed_classes でクラスを制限します。
$safe_data = unserialize($serialized_user, [
	'allowed_classes' => ['UserData'] // UserData クラスのみ復元を許可します。
]);
echo $safe_data->name; // 『花子』と出力されます。

// allowed_classes を false にするとすべてのクラスを拒否します。
$no_objects = unserialize($serialized_user, [
	'allowed_classes' => false // オブジェクトは __PHP_Incomplete_Class になります。
]);

// ファイルへのデータ保存の例です。
$settings = [
	'theme' => 'dark',
	'lang' => 'ja',
	'notifications' => true
];

file_put_contents('/tmp/settings.dat', serialize($settings));
$loaded = unserialize(file_get_contents('/tmp/settings.dat'), [
	'allowed_classes' => false
]);
echo $loaded['theme']; // 『dark』と出力されます。

// JSONとの比較です。外部システムとの連携にはJSONを推奨します。
$data = ['id' => 1, 'title' => 'PHP入門'];
echo serialize($data);          // PHP固有の形式
echo json_encode($data);        // 他の言語でも読める形式
概要

『serialize()』はPHPの値をバイト列形式の文字列に変換する関数で、ファイルやデータベースに複雑なデータ構造を保存する際に使用します。PHPのセッション機構も内部的に『serialize()』と『unserialize()』を使ってセッションデータを保存・復元しています。

『unserialize()』を使う際は、第2引数の『allowed_classes』オプションを必ず指定してください。信頼できないデータを『allowed_classes』なしでアンシリアライズすると、悪意のあるオブジェクトが復元されてリモートコード実行の脆弱性につながる可能性があります。外部からの入力をアンシリアライズする場合は『allowed_classes => false』を設定し、オブジェクトの復元を禁止してください。

外部システムとデータをやり取りする場合は、PHPに依存しないJSON形式の方が適しています。JSONについては json_encode() / json_decode() を使用してください。デバッグ出力については『var_dump()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。