Skip to content

Commit 80746c3

Browse files
committed
Fix PHP deprecations
Signed-off-by: Maurício Meneghini Fauth <mauricio@mfauth.com.br>
1 parent c6dcec2 commit 80746c3

8 files changed

Lines changed: 281 additions & 165 deletions

File tree

.github/workflows/php.yml

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,25 @@ jobs:
1212
runs-on: ubuntu-latest
1313
strategy:
1414
matrix:
15-
php-version: ['7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4']
15+
php-version: ['7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4', '8.5']
1616
name: PHP ${{ matrix.php-version }}
1717
steps:
1818
- uses: actions/checkout@v6
19+
20+
- name: Set up PHP ${{ matrix.php-version }}
21+
uses: shivammathur/setup-php@v2
22+
with:
23+
php-version: ${{ matrix.php-version }}
24+
extensions: mbstring
25+
1926
- name: Validate composer.json and composer.lock
2027
run: composer validate
21-
- name: Cache Composer packages
22-
id: composer-cache
23-
uses: actions/cache@v5
24-
with:
25-
path: vendor
26-
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
27-
restore-keys: |
28-
${{ runner.os }}-php-
28+
29+
- name: Install Composer dependencies
30+
uses: ramsey/composer-install@v3
31+
2932
- name: Install suggested dependencies
30-
run: composer require jeremeamia/superclosure opis/closure
31-
- name: Install dependencies
32-
if: steps.composer-cache.outputs.cache-hit != 'true'
33-
run: composer install --prefer-dist --no-progress --no-suggest
33+
run: composer require jeremeamia/superclosure opis/closure --with-all-dependencies --no-interaction
34+
3435
- name: Run test suite
3536
run: vendor/bin/phpunit

phpunit.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
colors="true">
1010
<testsuites>
1111
<testsuite name="JsonSerializerTests">
12-
<directory>./tests</directory>
12+
<file phpVersion="8.1.0">./tests/EnumSerializationTest.php</file>
13+
<file>./tests/JsonSerializerTest.php</file>
14+
<directory>./tests/ClosureSerializer</directory>
1315
</testsuite>
1416
</testsuites>
1517
<filter>

src/JsonSerializer/JsonSerializer.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -308,10 +308,10 @@ protected function serializeData($value)
308308
*/
309309
protected function serializeObject($value)
310310
{
311-
if ($this->objectStorage->contains($value)) {
311+
if ($this->objectStorage->offsetExists($value)) {
312312
return [static::CLASS_IDENTIFIER_KEY => '@' . $this->objectStorage[$value]];
313313
}
314-
$this->objectStorage->attach($value, $this->objectMappingIndex++);
314+
$this->objectStorage->offsetSet($value, $this->objectMappingIndex++);
315315

316316
$ref = new ReflectionClass($value);
317317
$className = $ref->getName();
@@ -402,8 +402,10 @@ protected function extractObjectData($value, $ref, $properties)
402402
foreach ($properties as $property) {
403403
try {
404404
$propRef = $this->getReflectionProperty($ref, $property);
405-
$propRef->setAccessible(true);
406-
if (!$propRef->isInitialized($value)) {
405+
if (PHP_VERSION_ID < 80100) {
406+
$propRef->setAccessible(true);
407+
}
408+
if (PHP_VERSION_ID >= 70400 && !$propRef->isInitialized($value)) {
407409
continue;
408410
}
409411
$data[$property] = $propRef->getValue($value);
@@ -548,7 +550,9 @@ protected function unserializeObject($value)
548550
foreach ($value as $property => $propertyValue) {
549551
try {
550552
$propRef = $this->getReflectionProperty($ref, $property);
551-
$propRef->setAccessible(true);
553+
if (PHP_VERSION_ID < 80100) {
554+
$propRef->setAccessible(true);
555+
}
552556
$propRef->setValue($obj, $this->unserializeData($propertyValue));
553557
} catch (ReflectionException $e) {
554558
switch ($this->undefinedAttributeMode) {

tests/ClosureSerializer/ClosureSerializerManagerTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class ClosureSerializerManagerTest extends TestCase
1010
{
1111
public function setUp(): void
1212
{
13-
if (! class_exists(\SuperClosure\SerializerInterface::class)) {
13+
if (! interface_exists(\SuperClosure\SerializerInterface::class)) {
1414
$this->markTestSkipped('Missing jeremeamia/superclosure to run this test');
1515
}
1616
}

tests/ClosureSerializer/SuperClosureSerializerTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class SuperClosureSerializerTest extends TestCase
99
{
1010
public function setUp(): void
1111
{
12-
if (! class_exists(\SuperClosure\SerializerInterface::class)) {
12+
if (! interface_exists(\SuperClosure\SerializerInterface::class)) {
1313
$this->markTestSkipped('Missing jeremeamia/superclosure to run this test');
1414
}
1515
}

tests/EnumSerializationTest.php

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
<?php
2+
3+
namespace Zumba\JsonSerializer\Test;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use stdClass;
7+
use Zumba\JsonSerializer\JsonSerializer;
8+
9+
final class EnumSerializationTest extends TestCase
10+
{
11+
/**
12+
* Serializer instance
13+
*
14+
* @var JsonSerializer
15+
*/
16+
protected $serializer;
17+
18+
/**
19+
* Test case setup
20+
*
21+
* @before
22+
* @return void
23+
*/
24+
#[\PHPUnit\Framework\Attributes\Before]
25+
public function setUpSerializer()
26+
{
27+
$customObjectSerializerMap['Zumba\\JsonSerializer\\Test\\SupportClasses\\MyType'] = new \Zumba\JsonSerializer\Test\SupportClasses\MyTypeSerializer();
28+
$this->serializer = new JsonSerializer(null, $customObjectSerializerMap);
29+
}
30+
31+
/**
32+
* Test serialization of Enums
33+
*
34+
* @return void
35+
*/
36+
public function testSerializeEnums()
37+
{
38+
$unitEnum = SupportEnums\MyUnitEnum::Hearts;
39+
$expected = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyUnitEnum","name":"Hearts"}';
40+
$this->assertSame($expected, $this->serializer->serialize($unitEnum));
41+
42+
$backedEnum = SupportEnums\MyBackedEnum::Hearts;
43+
$expected = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyBackedEnum","name":"Hearts","value":"H"}';
44+
$this->assertSame($expected, $this->serializer->serialize($backedEnum));
45+
46+
$intBackedEnum = SupportEnums\MyIntBackedEnum::One;
47+
$expected = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyIntBackedEnum","name":"One","value":1}';
48+
$this->assertSame($expected, $this->serializer->serialize($intBackedEnum));
49+
}
50+
51+
/**
52+
* Test serialization of multiple Enums
53+
*
54+
* @return void
55+
*/
56+
public function testSerializeMultipleEnums()
57+
{
58+
$obj = new stdClass();
59+
$obj->enum1 = SupportEnums\MyUnitEnum::Hearts;
60+
$obj->enum2 = SupportEnums\MyBackedEnum::Hearts;
61+
$obj->enum3 = SupportEnums\MyIntBackedEnum::One;
62+
$obj->enum4 = SupportEnums\MyUnitEnum::Hearts;
63+
$obj->enum5 = SupportEnums\MyBackedEnum::Hearts;
64+
$obj->enum6 = SupportEnums\MyIntBackedEnum::One;
65+
66+
$expected = '{"@type":"stdClass","enum1":{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyUnitEnum","name":"Hearts"},"enum2":{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyBackedEnum","name":"Hearts","value":"H"},"enum3":{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyIntBackedEnum","name":"One","value":1},"enum4":{"@type":"@1"},"enum5":{"@type":"@2"},"enum6":{"@type":"@3"}}';
67+
$this->assertSame($expected, $this->serializer->serialize($obj));
68+
}
69+
70+
/**
71+
* Test unserialization of Enums
72+
*
73+
* @return void
74+
*/
75+
public function testUnserializeEnums()
76+
{
77+
$serialized = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyUnitEnum","name":"Hearts"}';
78+
$obj = $this->serializer->unserialize($serialized);
79+
$this->assertInstanceOf('Zumba\JsonSerializer\Test\SupportEnums\MyUnitEnum', $obj);
80+
$this->assertSame(SupportEnums\MyUnitEnum::Hearts, $obj);
81+
82+
$serialized = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyBackedEnum","name":"Hearts","value":"H"}';
83+
$obj = $this->serializer->unserialize($serialized);
84+
$this->assertInstanceOf('Zumba\JsonSerializer\Test\SupportEnums\MyBackedEnum', $obj);
85+
$this->assertSame(SupportEnums\MyBackedEnum::Hearts, $obj);
86+
87+
$serialized = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyIntBackedEnum","name":"Two","value":2}';
88+
$obj = $this->serializer->unserialize($serialized);
89+
$this->assertInstanceOf('Zumba\JsonSerializer\Test\SupportEnums\MyIntBackedEnum', $obj);
90+
$this->assertSame(SupportEnums\MyIntBackedEnum::Two, $obj);
91+
$this->assertSame(SupportEnums\MyIntBackedEnum::Two->value, $obj->value);
92+
93+
// wrong value of BackedEnum is ignored
94+
$serialized = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyBackedEnum","name":"Hearts","value":"S"}';
95+
$obj = $this->serializer->unserialize($serialized);
96+
$this->assertInstanceOf('Zumba\JsonSerializer\Test\SupportEnums\MyBackedEnum', $obj);
97+
$this->assertSame(SupportEnums\MyBackedEnum::Hearts, $obj);
98+
$this->assertSame(SupportEnums\MyBackedEnum::Hearts->value, $obj->value);
99+
}
100+
101+
/**
102+
* Test unserialization of multiple Enums
103+
*
104+
* @return void
105+
*/
106+
public function testUnserializeMultipleEnums()
107+
{
108+
$obj = new stdClass();
109+
$obj->enum1 = SupportEnums\MyUnitEnum::Hearts;
110+
$obj->enum2 = SupportEnums\MyBackedEnum::Hearts;
111+
$obj->enum3 = SupportEnums\MyIntBackedEnum::One;
112+
$obj->enum4 = SupportEnums\MyUnitEnum::Hearts;
113+
$obj->enum5 = SupportEnums\MyBackedEnum::Hearts;
114+
$obj->enum6 = SupportEnums\MyIntBackedEnum::One;
115+
116+
$serialized = '{"@type":"stdClass","enum1":{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyUnitEnum","name":"Hearts"},"enum2":{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyBackedEnum","name":"Hearts","value":"H"},"enum3":{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyIntBackedEnum","name":"One","value":1},"enum4":{"@type":"@1"},"enum5":{"@type":"@2"},"enum6":{"@type":"@3"}}';
117+
$actualObj = $this->serializer->unserialize($serialized);
118+
$this->assertInstanceOf('stdClass', $actualObj);
119+
$this->assertEquals($obj, $actualObj);
120+
}
121+
122+
/**
123+
* Test unserialization of wrong UnitEnum
124+
*
125+
* @return void
126+
*/
127+
public function testUnserializeWrongUnitEnum() {
128+
// bad case generate Error
129+
$serialized = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyUnitEnum","name":"Circles"}';
130+
$this->expectException(\Error::class);
131+
$this->serializer->unserialize($serialized);
132+
}
133+
134+
/**
135+
* Test unserialization of wrong BackedEnum
136+
*
137+
* @return void
138+
*/
139+
public function testUnserializeWrongBackedEnum() {
140+
// bad case generate Error
141+
$serialized = '{"@type":"Zumba\\\\JsonSerializer\\\\Test\\\\SupportEnums\\\\MyBackedEnum","name":"Circles","value":"C"}';
142+
$this->expectException(\Error::class);
143+
$this->serializer->unserialize($serialized);
144+
}
145+
}

0 commit comments

Comments
 (0)