1--TEST--
2Test DateInterval::__serialize and DateInterval::__unserialize
3--FILE--
4<?php
5date_default_timezone_set("Europe/London");
6
7$d = DateInterval::createFromDateString('next weekday');
8echo "Original object:\n";
9var_dump($d);
10
11echo "\n\nSerialised object:\n";
12$s = serialize($d);
13var_dump($s);
14
15echo "\n\nUnserialised object:\n";
16$e = unserialize($s);
17var_dump($e);
18
19echo "\n\nCalling __serialize manually:\n";
20var_dump($d->__serialize());
21
22echo "\n\nCalling __unserialize manually:\n";
23$d = new DateInterval('P2Y4DT6H8M');
24$d->__unserialize(
25	[
26		'from_string' => true,
27		'date_string' => 'next weekday',
28	]
29);
30var_dump($d);
31
32echo "\n\nUsed serialised interval:\n";
33$now = new DateTimeImmutable("2022-04-22 16:25:11 BST");
34var_dump($now->add($e));
35try {
36	var_dump($now->sub($e));
37} catch (DateInvalidOperationException $e) {
38	echo $e::class, ': ', $e->getMessage(), "\n";
39}
40?>
41--EXPECTF--
42Original object:
43object(DateInterval)#1 (%d) {
44  ["from_string"]=>
45  bool(true)
46  ["date_string"]=>
47  string(%d) "next weekday"
48}
49
50
51Serialised object:
52string(%d) "O:12:"DateInterval":2:{s:11:"from_string";b:1;s:11:"date_string";s:%d:"next weekday";}"
53
54
55Unserialised object:
56object(DateInterval)#2 (2) {
57  ["from_string"]=>
58  bool(true)
59  ["date_string"]=>
60  string(%d) "next weekday"
61}
62
63
64Calling __serialize manually:
65array(2) {
66  ["from_string"]=>
67  bool(true)
68  ["date_string"]=>
69  string(%d) "next weekday"
70}
71
72
73Calling __unserialize manually:
74object(DateInterval)#3 (2) {
75  ["from_string"]=>
76  bool(true)
77  ["date_string"]=>
78  string(%d) "next weekday"
79}
80
81
82Used serialised interval:
83object(DateTimeImmutable)#4 (3) {
84  ["date"]=>
85  string(26) "2022-04-25 16:25:11.000000"
86  ["timezone_type"]=>
87  int(2)
88  ["timezone"]=>
89  string(3) "BST"
90}
91DateInvalidOperationException: DateTimeImmutable::sub(): Only non-special relative time specifications are supported for subtraction
92