diff --git a/src/Proxy/ProxyGenerator.php b/src/Proxy/ProxyGenerator.php index ec6fb1004..9f35fd5a2 100644 --- a/src/Proxy/ProxyGenerator.php +++ b/src/Proxy/ProxyGenerator.php @@ -1282,7 +1282,6 @@ function (ReflectionType $intersectedType) use ($method, $parameter) { if ( $type->allowsNull() && ! in_array($name, ['mixed', 'null'], true) - && ($parameter === null || ! $parameter->isDefaultValueAvailable() || $parameter->getDefaultValue() !== null) ) { $name = '?' . $name; } diff --git a/tests/Common/Proxy/Php8UnionTypes.php b/tests/Common/Proxy/Php8UnionTypes.php index ab5c391c8..c95412746 100644 --- a/tests/Common/Proxy/Php8UnionTypes.php +++ b/tests/Common/Proxy/Php8UnionTypes.php @@ -12,10 +12,16 @@ class Php8UnionTypes public function setValue(stdClass|array $value) : bool|float { + return true; } public function setNullableValue(stdClass|array|null $value) : bool|float|null { + return true; } + public function setNullableValueDefaultNull(stdClass|array|null $value = null) : bool|float|null + { + return true; + } } diff --git a/tests/Common/Proxy/ProxyGeneratorTest.php b/tests/Common/Proxy/ProxyGeneratorTest.php index 59c1eb3ef..59b796eda 100644 --- a/tests/Common/Proxy/ProxyGeneratorTest.php +++ b/tests/Common/Proxy/ProxyGeneratorTest.php @@ -180,7 +180,7 @@ public function testClassWithScalarTypeHintsOnProxiedMethods() self::assertEquals(1, substr_count($classCode, 'function combinationOfTypeHintsAndNormal(\stdClass $a, \Countable $b, $c, int $d)')); self::assertEquals(1, substr_count($classCode, 'function typeHintsWithVariadic(int ...$foo)')); self::assertEquals(1, substr_count($classCode, 'function withDefaultValue(int $foo = 123)')); - self::assertEquals(1, substr_count($classCode, 'function withDefaultValueNull(int $foo = NULL)')); + self::assertEquals(1, substr_count($classCode, 'function withDefaultValueNull(?int $foo = NULL)')); } public function testClassWithReturnTypesOnProxiedMethods() @@ -220,8 +220,8 @@ public function testClassWithNullableTypeHintsOnProxiedMethods() self::assertEquals(1, substr_count($classCode, 'function nullableTypeHintObject(?\stdClass $param)')); self::assertEquals(1, substr_count($classCode, 'function nullableTypeHintSelf(?\\' . $className . ' $param)')); self::assertEquals(1, substr_count($classCode, 'function nullableTypeHintWithDefault(?int $param = 123)')); - self::assertEquals(1, substr_count($classCode, 'function nullableTypeHintWithDefaultNull(int $param = NULL)')); - self::assertEquals(1, substr_count($classCode, 'function notNullableTypeHintWithDefaultNull(int $param = NULL)')); + self::assertEquals(1, substr_count($classCode, 'function nullableTypeHintWithDefaultNull(?int $param = NULL)')); + self::assertEquals(1, substr_count($classCode, 'function notNullableTypeHintWithDefaultNull(?int $param = NULL)')); } public function testClassWithNullableReturnTypesOnProxiedMethods() @@ -460,6 +460,11 @@ public function testPhp8UnionTypes() 'setNullableValue(\stdClass|array|null $value): float|bool|null', file_get_contents(__DIR__ . '/generated/__CG__DoctrineTestsCommonProxyPhp8UnionTypes.php') ); + + self::assertStringContainsString( + 'setNullableValueDefaultNull(\stdClass|array|null $value = NULL): float|bool|null', + file_get_contents(__DIR__ . '/generated/__CG__DoctrineTestsCommonProxyPhp8UnionTypes.php') + ); } /**