3v4l.org

run code in 300+ PHP versions simultaneously
<?php // --- 1. シンプルな独自定義クラス --- class MySimpleClass { public string $publicProp; private int $privateProp; // privateプロパティもシリアライズされる protected array $protectedProp; public ?MySimpleClass $parent = null; // 自己参照または他のオブジェクト参照用 public array $nestedArrayData; public string $sharedStringRef1; public string $sharedStringRef2; public object $sharedObjectRef1; public object $sharedObjectRef2; public object $customSerializableObj; public object $userRoleEnum; // Backed Enum public object $statusEnum; // Pure Enum public $nullValue; public bool $booleanTrue; public float $floatValue; public int $integerValue; public string $japaneseString; public function __construct(string $public, int $private, array $protected) { $this->publicProp = $public; $this->privateProp = $private; $this->protectedProp = $protected; $this->nestedArrayData = []; // 初期化 } public function getPrivateProp(): int { return $this->privateProp; } } // --- 2. カスタムシリアライズ可能なクラス (PHP 7.4+ の __serialize/__unserialize) --- class MyCustomSerializable { public string $dataString; private int $dataNumber; public function __construct(string $s, int $n) { $this->dataString = $s; $this->dataNumber = $n; } // オブジェクトがシリアライズされる直前に呼び出される // シリアライズしたいプロパティを連想配列で返す public function __serialize(): array { echo "__serialize() called for MyCustomSerializable\n"; return [ 's' => $this->dataString, 'n' => $this->dataNumber, ]; } // オブジェクトがデシリアライズされた直後に呼び出される // __serialize() で返された連想配列を受け取る public function __unserialize(array $data): void { echo "__unserialize() called for MyCustomSerializable\n"; $this->dataString = $data['s']; $this->dataNumber = $data['n']; } public function getCustomData(): string { return "Custom: " . $this->dataString . " / " . $this->dataNumber; } } // --- 3. Enum の定義 (PHP 8.1+) --- enum UserRole: string // Backed Enum { case Admin = 'admin'; case Editor = 'editor'; case Viewer = 'viewer'; } enum Status // Pure Enum { case Active; case Inactive; } // --- シリアライズ対象データ構造の構築 (トップレベルがオブジェクト) --- // オブジェクト参照と値参照のための共通データ $commonObject = new MySimpleClass('共通オブジェクト', 500, ['shared' => true]); $commonString = "共有される文字列データ"; // トップレベルのオブジェクトを作成し、多様なデータをプロパティとして持つ $topLevelObject = new MySimpleClass('Top Level Object', 999, ['root_data' => 'initial']); // 1. スカラー型 (Scalar Types) $topLevelObject->japaneseString = "これは日本語の文字列です"; $topLevelObject->integerValue = 123; $topLevelObject->floatValue = 45.67; $topLevelObject->booleanTrue = true; $topLevelObject->nullValue = null; // 2. リスト (数値キーの配列) $topLevelObject->nestedArrayData = [ 'Item A', 'Item B', 'Item C', 10, false, ]; // 3. 連想配列 (Associative Array) $topLevelObject->protectedProp = [ // protectedProp を再利用して連想配列を入れる 'assoc_key1' => 'assoc_value1', 'assoc_key2' => 789, 'deep_nested_array' => [ 'sub_key_x' => 'sub_value_x', 'sub_key_y' => 12.34, ], ]; // 4. オブジェクト参照 (r:) - 別のオブジェクトへの参照 $topLevelObject->sharedObjectRef1 = $commonObject; $topLevelObject->sharedObjectRef2 = $commonObject; // 同じオブジェクトへの参照 // 5. 値参照 (R:) - 同じ文字列への参照 $topLevelObject->sharedStringRef1 = $commonString; $topLevelObject->sharedStringRef2 = $commonString; // 同じ文字列への参照 // 6. Enum (PHP 8.1+ の場合) $topLevelObject->userRoleEnum = UserRole::Editor; $topLevelObject->statusEnum = Status::Active; // 7. カスタムシリアライズ可能なオブジェクト (C:) $topLevelObject->customSerializableObj = new MyCustomSerializable('オブジェクト内のカスタム', 777); // --- シリアライズ実行 --- $serializedResult = serialize($topLevelObject); // --- 出力 --- echo "--- 元データ (var_export) ---\n"; var_export($topLevelObject); echo "\n\n"; echo "--- シリアライズ結果 ---\n"; echo $serializedResult; echo "\n\n"; // --- デシリアライズの確認 (オプション) --- // このスクリプト内でデシリアライズすることで、__unserialize() が呼び出されることを確認できます。 echo "--- デシリアライズ処理の開始 ---\n"; $unserializedData = unserialize($serializedResult); echo "--- デシerializ処理の完了 ---\n\n"; echo "--- デシリアライズ結果 (var_export) ---\n"; var_export($unserializedData); echo "\n"; // デシリアライズされたオブジェクトへのアクセス例と参照確認 if ($unserializedData instanceof MySimpleClass) { echo "トップレベルのオブジェクトの publicProp: " . $unserializedData->publicProp . "\n"; echo "トップレベルのオブジェクトのプライベートプロパティ: " . $unserializedData->getPrivateProp() . "\n"; if (isset($unserializedData->customSerializableObj) && $unserializedData->customSerializableObj instanceof MyCustomSerializable) { echo "オブジェクト内のカスタムシリアライズオブジェクトのデータ: " . $unserializedData->customSerializableObj->getCustomData() . "\n"; } if ($unserializedData->sharedObjectRef1 === $unserializedData->sharedObjectRef2) { echo "オブジェクト参照 (sharedObjectRef1 と sharedObjectRef2) は正しく復元されました。\n"; } if ($unserializedData->sharedStringRef1 === $unserializedData->sharedStringRef2) { echo "値参照 (sharedStringRef1 と sharedStringRef2) は正しく復元されました。\n"; } if (isset($unserializedData->userRoleEnum) && $unserializedData->userRoleEnum instanceof UserRole) { echo "Enum (UserRole): " . $unserializedData->userRoleEnum->value . "\n"; } if (isset($unserializedData->statusEnum) && $unserializedData->statusEnum instanceof Status) { echo "Enum (Status): " . $unserializedData->statusEnum->name . "\n"; } } else { echo "デシリアライズされたデータは期待されるオブジェクトではありませんでした。\n"; var_dump($unserializedData); } ?>

Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).

VersionSystem time (s)User time (s)Memory (MiB)
8.5.10.0100.00816.99
8.5.00.0120.00919.95
8.4.150.0020.00014.05
8.4.140.0100.01117.90
8.4.130.0100.01217.87
8.4.120.0150.00520.61
8.4.110.0090.01119.09
8.4.100.0110.01017.97
8.4.90.0130.00917.94
8.4.80.0410.00918.05
8.4.70.0400.01118.00
8.4.60.0420.00818.09
8.4.50.0390.00718.12
8.4.40.0460.00817.60
8.4.30.0430.00917.94
8.4.20.0500.00817.64
8.4.10.0310.00917.71
8.3.280.0020.00014.05
8.3.270.0150.00617.01
8.3.260.0120.00716.70
8.3.250.0110.00719.03
8.3.240.0140.00716.89
8.3.230.0140.00516.81
8.3.220.0210.00616.97
8.3.210.0180.00316.97
8.3.200.0170.00416.97
8.3.190.0340.00416.97
8.3.180.0320.01016.97
8.3.170.0300.00516.97
8.3.160.0450.01216.97
8.3.150.0170.00716.97
8.3.140.0220.00316.97
8.3.130.0200.00316.97
8.3.120.0250.00116.97
8.3.110.0170.00616.97
8.3.100.0210.00216.97
8.3.90.0180.00616.97
8.3.80.0180.00616.97
8.3.70.0180.00516.97
8.3.60.0290.00716.97
8.3.50.0180.00416.97
8.3.40.0190.00317.77
8.3.30.0300.01017.75
8.3.20.0320.00617.64
8.3.10.0350.00917.75
8.3.00.0360.00917.53
8.2.290.0110.00618.92
8.2.280.0370.00516.97
8.2.270.0380.00516.97
8.2.260.0280.00816.97
8.2.250.0370.00616.97
8.2.240.0360.00616.97
8.2.230.0380.00516.97
8.2.220.0360.00716.97
8.2.210.0320.01116.97
8.2.200.0340.00916.97
8.2.190.0320.01216.97
8.2.180.0360.00716.97
8.2.170.0380.00717.76
8.2.160.0390.00917.66
8.2.150.0500.00917.38
8.2.140.0400.01017.54
8.2.130.0430.01017.51
8.2.120.0350.00617.86
8.2.110.0290.00817.76
8.2.100.0280.00917.79
8.2.90.0390.00517.59
8.2.80.0360.00517.58
8.2.70.0360.00817.58
8.2.60.0380.00517.55
8.2.50.0350.01117.52
8.2.40.0280.01017.55
8.2.30.0320.00617.55
8.2.20.0350.00717.73
8.2.10.0280.00317.83
8.2.00.0250.01017.48

preferences:
30.22 ms | 403 KiB | 5 Q