diff --git a/lib/Doctrine/Common/Proxy/ProxyGenerator.php b/lib/Doctrine/Common/Proxy/ProxyGenerator.php index ec904312f..a3c431e37 100644 --- a/lib/Doctrine/Common/Proxy/ProxyGenerator.php +++ b/lib/Doctrine/Common/Proxy/ProxyGenerator.php @@ -44,6 +44,8 @@ use function mkdir; use function preg_match; use function preg_match_all; +use function preg_replace; +use function preg_split; use function random_bytes; use function rename; use function rtrim; @@ -58,6 +60,7 @@ use const DIRECTORY_SEPARATOR; use const PHP_VERSION_ID; +use const PREG_SPLIT_DELIM_CAPTURE; /** * This factory is used to generate proxy classes. @@ -1089,10 +1092,7 @@ private function buildParametersString(array $parameters, array $renameParameter } $parameterDefinition .= '$' . ($renameParameters ? $renameParameters[$i] : $param->getName()); - - if ($param->isDefaultValueAvailable()) { - $parameterDefinition .= ' = ' . var_export($param->getDefaultValue(), true); - } + $parameterDefinition .= $this->getParameterDefaultValue($param); $parameterDefinitions[] = $parameterDefinition; } @@ -1116,6 +1116,30 @@ private function getParameterType(ReflectionParameter $parameter) return $this->formatType($parameter->getType(), $declaringFunction, $parameter); } + private function getParameterDefaultValue(ReflectionParameter $parameter) + { + if (! $parameter->isDefaultValueAvailable()) { + return ''; + } + + if (PHP_VERSION_ID < 80100) { + return ' = ' . var_export($parameter->getDefaultValue(), true); + } + + $value = rtrim(substr(explode('$' . $parameter->getName() . ' = ', (string) $parameter, 2)[1], 0, -2)); + $parts = preg_split('{(\'(?:[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\')}', $value, -1, PREG_SPLIT_DELIM_CAPTURE); + + foreach ($parts as $i => &$part) { + if ($part === '' || $i % 2 !== 0) { + continue; + } + + $part = preg_replace('/(?(DEFINE)(?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+))(?assertSame($object->isEnum, \Doctrine\Tests\Common\Proxy\YesOrNo::YES); } + /** + * @requires PHP >= 8.1.0 + */ + public function testPhp81NewInInitializers() + { + $className = PHP81NewInInitializers::class; + + if (!class_exists('Doctrine\Tests\Common\ProxyProxy\__CG__\PHP81NewInInitializers', false)) { + $metadata = $this->createClassMetadata($className, ['id']); + + $proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy'); + $this->generateAndRequire($proxyGenerator, $metadata); + } + + self::assertStringContainsString( + 'onlyInitializer($foo = new \stdClass()): void', + file_get_contents(__DIR__ . '/generated/__CG__DoctrineTestsCommonProxyPHP81NewInInitializers.php') + ); + + self::assertStringContainsString( + 'typed(\DateTimeInterface $foo = new \DateTimeImmutable(\'now\')): void', + file_get_contents(__DIR__ . '/generated/__CG__DoctrineTestsCommonProxyPHP81NewInInitializers.php') + ); + } + /** * @param string $className * @param mixed[] $ids