【PHP8.x】__unserializeメソッドの使い方

__unserializeメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

__unserializeメソッドは、PHPのDatePeriodオブジェクトが文字列から元のオブジェクトの状態に復元(デシリアライズ)される際に、カスタムの処理を実行するメソッドです。

このメソッドは、unserialize()関数が呼ばれ、DatePeriodオブジェクトのインスタンスを再構築する必要がある場合に、PHPエンジンによって自動的に呼び出されます。引数として$dataという配列を受け取ります。この$data配列には、オブジェクトがシリアライズ(文字列化)される際に、__serialize()メソッドが返したデータが格納されています。

DatePeriodオブジェクトにとって、この__unserializeメソッドは、開始日時、終了日時、インターバル(期間)、そしてオプションのリカーレンス(繰り返し回数)といった、オブジェクトの内部状態を正確に復元するために不可欠な役割を果たします。これにより、一度シリアライズされたDatePeriodオブジェクトを、後で全く同じ状態のオブジェクトとして再利用できるようになります。

PHP 8では、オブジェクトのカスタムシリアライズ処理には__serialize()__unserialize()のペアを使用することが推奨されています。DatePeriodにおける__unserializeメソッドは、デシリアライズ時のオブジェクトの状態復元を制御し、データの整合性を保つ上で重要な役割を担っています。

構文(syntax)

1public function __unserialize(array $data): void

引数(parameters)

array $data

  • array $data: オブジェクトを再構築するために使用されるシリアライズされたデータ配列

戻り値(return)

void

__unserializeメソッドは、オブジェクトのシリアライズされた状態を復元するために使用されます。このメソッドは値を返しません。

サンプルコード

PHP DatePeriod の unserialize による復元

1<?php
2
3/**
4 * DatePeriod オブジェクトのシリアライズとデシリアライズの例。
5 * PHP の unserialize() 関数が DatePeriod::__unserialize メソッドを内部的に利用し、
6 * オブジェクトの状態を復元する仕組みを示します。
7 */
8
9// 1. オリジナルの DatePeriod オブジェクトを作成します。
10// 開始日、期間、終了日を指定して、日付の繰り返しを表現します。
11$startDate = new DateTime('2023-01-01');
12$interval = new DateInterval('P1D'); // 1日ごと
13$endDate = new DateTime('2023-01-05'); // 2023-01-01, 02, 03, 04 までを含む
14
15$originalDatePeriod = new DatePeriod($startDate, $interval, $endDate);
16
17echo "--- オリジナル DatePeriod オブジェクトの状態 ---\n";
18echo "開始日: " . $originalDatePeriod->getStartDate()->format('Y-m-d') . "\n";
19echo "期間: " . $originalDatePeriod->getDateInterval()->format('%D日間') . "\n";
20echo "終了日: " . $originalDatePeriod->getEndDate()->format('Y-m-d') . "\n";
21
22// 2. DatePeriod オブジェクトをシリアライズします。
23// serialize() 関数はオブジェクトをバイト列(文字列)に変換します。
24// この際、PHPの内部で DatePeriod::__serialize メソッドが呼び出され、
25// オブジェクトの内部状態が適切に保存されます。
26$serializedData = serialize($originalDatePeriod);
27
28echo "\n--- シリアライズされたデータ (文字列) ---\n";
29echo $serializedData . "\n";
30
31// 3. シリアライズされたデータからオブジェクトをデシリアライズします。
32// unserialize() 関数はバイト列を元のオブジェクトに復元します。
33// この際、PHPの内部で DatePeriod::__unserialize メソッドが呼び出され、
34// 保存されたデータからオブジェクトの状態が正確に復元されます。
35$unserializedDatePeriod = unserialize($serializedData);
36
37echo "\n--- デシリアライズされた DatePeriod オブジェクトの状態 ---\n";
38
39// 復元されたオブジェクトが DatePeriod のインスタンスであることを確認します。
40if ($unserializedDatePeriod instanceof DatePeriod) {
41    echo "開始日: " . $unserializedDatePeriod->getStartDate()->format('Y-m-d') . "\n";
42    echo "期間: " . $unserializedDatePeriod->getDateInterval()->format('%D日間') . "\n";
43    echo "終了日: " . $unserializedDatePeriod->getEndDate()->format('Y-m-d') . "\n";
44
45    // オリジナルとデシリアライズされたオブジェクトのプロパティを比較し、
46    // 正しく復元されたかを確認します。
47    if (
48        $originalDatePeriod->getStartDate()->format('Y-m-d') === $unserializedDatePeriod->getStartDate()->format('Y-m-d') &&
49        $originalDatePeriod->getDateInterval()->format('%D') === $unserializedDatePeriod->getDateInterval()->format('%D') &&
50        $originalDatePeriod->getEndDate()->format('Y-m-d') === $unserializedDatePeriod->getEndDate()->format('Y-m-d')
51    ) {
52        echo "\n成功: DatePeriod オブジェクトは正しくシリアライズされ、デシリアライズにより元の状態に復元されました。\n";
53    } else {
54        echo "\nエラー: DatePeriod オブジェクトの復元に失敗したか、一部が正しくありません。\n";
55    }
56} else {
57    echo "\nエラー: デシリアライズに失敗し、DatePeriod オブジェクトとして復元できませんでした。\n";
58}

PHP 8のDatePeriodクラスに属する__unserializeメソッドは、オブジェクトを「デシリアライズ」する際に、その内部状態を元の形に復元するための特別なメソッドです。ここでいうデシリアライズとは、一度保存されたオブジェクトのデータ(バイト列や文字列)から、元のオブジェクトを再構築する処理を指します。

このメソッドは、PHPのunserialize()関数が呼び出された時に、PHPの内部で自動的に実行されます。引数として渡される$dataは、オブジェクトが「シリアライズ」(保存可能な形式に変換)された際に記録された、オブジェクトのプロパティ情報を含む配列です。__unserializeメソッドは、この$data配列から開始日や期間、終了日といったDatePeriodオブジェクトの重要な情報を取り出し、オブジェクトの状態を正確に設定し直します。戻り値はvoidであり、メソッド自体は値を返さず、オブジェクト自身の状態が直接変更されることで復元処理が完了します。

サンプルコードでは、DatePeriodオブジェクトをserialize()関数で文字列に変換し、その後unserialize()関数で元のオブジェクトとして復元する一連の流れが示されています。この復元の裏側でDatePeriod::__unserializeが働き、日付の繰り返し情報が正確に再構築される様子を確認できます。これにより、日付の期間情報のような複雑なオブジェクトも、簡単に保存し、必要な時にいつでも元の状態で利用できる仕組みが提供されます。

このサンプルコードは、PHPのDatePeriodオブジェクトをシリアライズし、元の状態にデシリアライズする過程を示しています。DatePeriod::__unserializeメソッドは、開発者が直接呼び出すものではなく、unserialize()関数がシリアライズされたデータからオブジェクトの状態を復元する際に、PHPが内部的に利用する特別なマジックメソッドです。

最も重要な注意点として、unserialize()関数は、信頼できない外部からの入力データに対して絶対に使用しないでください。悪意のあるシリアライズデータは、コード実行などの深刻なセキュリティ脆弱性につながる可能性があります。オブジェクトの状態をファイルやデータベースに保存して後で復元したり、異なるプロセス間で受け渡したりする際に便利ですが、その際はデータの信頼性を厳重に確認し、常にセキュリティリスクを意識して利用することが不可欠です。

関連コンテンツ

関連プログラミング言語