serialize() / unserialize()
| 対応: | PHP 4(2000) |
|---|
PHPの値をバイト列に変換して保存・転送し、元の値に復元する関数です。セッションデータの保存やキャッシュに使用します。シリアライズ後の文字列は例えば『a:2:{s:4:"name";s:6:"user_1";}』のような形式になります。
構文
// 値をシリアライズして文字列に変換します serialize($value); // シリアライズされた文字列を元の値に復元します unserialize($data, $options);
関数一覧
| 関数 | 概要 |
|---|---|
| serialize($value) | PHP の値をバイト列の文字列に変換します。配列、オブジェクト、整数、文字列など、ほぼすべての型を変換できますが、リソース型とクロージャは変換できません。 |
| unserialize($data, $options) | シリアライズされた文字列を元のPHP値に復元します。第2引数の『allowed_classes』オプションで復元を許可するクラスを制限できます。 |
サンプルコード
sample_serialize.php
<?php
// 配列をシリアライズします
$data = ['name' => 'user_1', 'age' => 20, 'skills' => ['PHP', 'JavaScript', 'skill_a']];
$serialized = serialize($data);
echo $serialized . "\n"; // シリアライズ形式の文字列が出力されます
// シリアライズした文字列を復元します
$restored = unserialize($serialized);
echo $restored['name'] . "\n";
print_r($restored['skills']); // 元の配列が復元されます
// さまざまな型のシリアライズ結果を確認します
echo serialize(42) . "\n";
echo serialize(3.14) . "\n";
echo serialize("PHP") . "\n";
echo serialize(true) . "\n";
echo serialize(null) . "\n";
// オブジェクトのシリアライズです
class UserData {
public function __construct(
public string $name,
public string $email
) {}
}
$user = new UserData("user_2", "user_1@example.com");
$serialized_user = serialize($user);
echo $serialized_user . "\n";
// 安全なunserialize: allowed_classes でクラスを制限します
$safe_data = unserialize($serialized_user, [
'allowed_classes' => ['UserData'] // UserData クラスのみ復元を許可します
]);
echo $safe_data->name . "\n";
// allowed_classes を false にするとすべてのクラスを拒否します
$no_objects = unserialize($serialized_user, [
'allowed_classes' => false
]);
// ファイルへのデータ保存の例です
$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'] . "\n";
// JSONとの比較です。外部システムとの連携にはJSONを推奨します
$data = ['id' => 1, 'title' => 'PHP入門'];
echo serialize($data) . "\n"; // PHP固有の形式
echo json_encode($data) . "\n"; // 他の言語でも読める形式
実行すると次のように出力されます。
php sample_serialize.php
a:3:{s:4:"name";s:6:"user_1";s:3:"age";i:20;s:6:"skills";a:3:{i:0;s:3:"PHP";i:1;s:10:"JavaScript";i:2;s:7:"skill_a";}}
user_1
Array
(
[0] => PHP
[1] => JavaScript
[2] => skill_a
)
i:42;
d:3.14;
s:3:"PHP";
b:1;
N;
O:8:"UserData":2:{s:4:"name";s:6:"user_2";s:5:"email";s:18:"user_1@example.com";}
user_2
dark
a:2:{s:2:"id";i:1;s:5:"title";s:9:"PHP入門";}
{"id":1,"title":"PHP\u5165\u9580"}
概要
『serialize()』はPHPの値をバイト列形式の文字列に変換する関数で、ファイルやデータベースに複雑なデータ構造を保存する際に使用します。PHPのセッション機構も内部的に『serialize()』と『unserialize()』を使ってセッションデータを保存・復元しています。
『unserialize()』を使う際は、第2引数の『allowed_classes』オプションを必ず指定してください。信頼できないデータを『allowed_classes』なしでアンシリアライズすると、悪意のあるオブジェクトが復元されてリモートコード実行の脆弱性につながる可能性があります。外部からの入力をアンシリアライズする場合は『allowed_classes => false』を設定し、オブジェクトの復元を禁止してください。
外部システムとデータをやり取りする場合は、PHPに依存しないJSON形式の方が適しています。JSONについては json_encode() / json_decode() を使用してください。デバッグ出力については『var_dump()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。