Skip to content

Commit 69cde17

Browse files
committed
Merge remote-tracking branch 'origin/php-constructor-null-optional' into release-31.0-patch
2 parents a9451ea + cb6c958 commit 69cde17

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

php/ext/google/protobuf/message.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,14 @@ bool Message_InitFromPhp(upb_Message* msg, const upb_MessageDef* m, zval* init,
533533
return false;
534534
}
535535

536+
// Handle NULL optional field
537+
if (Z_TYPE_P(val) == IS_NULL && upb_FieldDef_IsOptional(f)) {
538+
upb_Message_ClearFieldByDef(msg, f);
539+
zend_hash_move_forward_ex(table, &pos);
540+
zval_dtor(&key);
541+
continue;
542+
}
543+
536544
if (upb_FieldDef_IsMap(f)) {
537545
msgval.map_val = MapField_GetUpbMap(val, MapType_Get(f), arena);
538546
if (!msgval.map_val) return false;

php/tests/GeneratedClassTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1666,6 +1666,26 @@ public function testOneofStringInArrayConstructor()
16661666
$this->assertTrue(true);
16671667
}
16681668

1669+
public function testOptionalValueConstructor()
1670+
{
1671+
$m = new TestMessage([
1672+
'optional_message' => new Sub([
1673+
'a' => 1
1674+
]),
1675+
'true_optional_message' => null,
1676+
'repeated_message' => [
1677+
new Sub(['a' => 2]),
1678+
new Sub(['a' => 3])
1679+
],
1680+
]);
1681+
1682+
$this->assertFalse($m->hasTrueOptionalMessage());
1683+
$this->assertNull($m->getTrueOptionalMessage());
1684+
1685+
$this->assertEquals(1, $m->getOptionalMessage()->getA());
1686+
$this->assertCount(2, $m->getRepeatedMessage());
1687+
}
1688+
16691689
#########################################################
16701690
# Test clone.
16711691
#########################################################

0 commit comments

Comments
 (0)