diff --git a/src/Symfony/Bridge/Doctrine/ManagerRegistry.php b/src/Symfony/Bridge/Doctrine/ManagerRegistry.php
index fa4d88b99455d..5fac3f0a8c3f6 100644
--- a/src/Symfony/Bridge/Doctrine/ManagerRegistry.php
+++ b/src/Symfony/Bridge/Doctrine/ManagerRegistry.php
@@ -12,8 +12,6 @@
namespace Symfony\Bridge\Doctrine;
use Doctrine\Persistence\AbstractManagerRegistry;
-use ProxyManager\Proxy\GhostObjectInterface;
-use ProxyManager\Proxy\LazyLoadingInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\VarExporter\LazyObjectInterface;
@@ -45,34 +43,6 @@ protected function resetService($name): void
return;
}
- if (\PHP_VERSION_ID < 80400) {
- if (!$manager instanceof LazyLoadingInterface) {
- throw new \LogicException(\sprintf('Resetting a non-lazy manager service is not supported. Declare the "%s" service as lazy.', $name));
- }
- trigger_deprecation('symfony/doctrine-bridge', '7.3', 'Support for proxy-manager is deprecated.');
-
- if ($manager instanceof GhostObjectInterface) {
- throw new \LogicException('Resetting a lazy-ghost-object manager service is not supported.');
- }
- $manager->setProxyInitializer(\Closure::bind(
- function (&$wrappedInstance, LazyLoadingInterface $manager) use ($name) {
- $name = $this->aliases[$name] ?? $name;
- $wrappedInstance = match (true) {
- isset($this->fileMap[$name]) => $this->load($this->fileMap[$name], false),
- !$method = $this->methodMap[$name] ?? null => throw new \LogicException(\sprintf('The "%s" service is synthetic and cannot be reset.', $name)),
- (new \ReflectionMethod($this, $method))->isStatic() => $this->{$method}($this, false),
- default => $this->{$method}(false),
- };
- $manager->setProxyInitializer(null);
-
- return true;
- },
- $this->container,
- Container::class
- ));
-
- return;
- }
$r = new \ReflectionClass($manager);
diff --git a/src/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php b/src/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php
index 78b962dfdbcae..48c535726e70d 100644
--- a/src/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php
+++ b/src/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php
@@ -100,7 +100,7 @@ public function refreshUser(UserInterface $user): UserInterface
if ($refreshedUser instanceof Proxy && !$refreshedUser->__isInitialized()) {
$refreshedUser->__load();
- } elseif (\PHP_VERSION_ID >= 80400 && ($r = new \ReflectionClass($refreshedUser))->isUninitializedLazyObject($refreshedUser)) {
+ } elseif (($r = new \ReflectionClass($refreshedUser))->isUninitializedLazyObject($refreshedUser)) {
$r->initializeLazyObject($refreshedUser);
}
diff --git a/src/Symfony/Bridge/Doctrine/Tests/DoctrineTestHelper.php b/src/Symfony/Bridge/Doctrine/Tests/DoctrineTestHelper.php
index 40472ff73ef40..ce1a4aba065ac 100644
--- a/src/Symfony/Bridge/Doctrine/Tests/DoctrineTestHelper.php
+++ b/src/Symfony/Bridge/Doctrine/Tests/DoctrineTestHelper.php
@@ -47,7 +47,7 @@ public static function createTestEntityManager(?Configuration $config = null): E
$config ??= self::createTestConfiguration();
$eventManager = new EventManager();
- if (\PHP_VERSION_ID >= 80400 && method_exists($config, 'enableNativeLazyObjects')) {
+ if (method_exists($config, 'enableNativeLazyObjects')) {
$config->enableNativeLazyObjects(true);
}
diff --git a/src/Symfony/Bridge/Doctrine/Tests/ManagerRegistryTest.php b/src/Symfony/Bridge/Doctrine/Tests/ManagerRegistryTest.php
index 4803e6acaf0af..d2d670eb4e694 100644
--- a/src/Symfony/Bridge/Doctrine/Tests/ManagerRegistryTest.php
+++ b/src/Symfony/Bridge/Doctrine/Tests/ManagerRegistryTest.php
@@ -50,8 +50,6 @@ public function testResetService()
}
/**
- * @requires PHP 8.4
- *
* @dataProvider provideResetServiceWithNativeLazyObjectsCases
*/
public function testResetServiceWithNativeLazyObjects(string $class)
diff --git a/src/Symfony/Bridge/Doctrine/Tests/Security/User/EntityUserProviderTest.php b/src/Symfony/Bridge/Doctrine/Tests/Security/User/EntityUserProviderTest.php
index 82bc79f072ecd..ac7f87a3b8e3c 100644
--- a/src/Symfony/Bridge/Doctrine/Tests/Security/User/EntityUserProviderTest.php
+++ b/src/Symfony/Bridge/Doctrine/Tests/Security/User/EntityUserProviderTest.php
@@ -220,7 +220,7 @@ public function testRefreshedUserProxyIsLoaded()
$provider = new EntityUserProvider($this->getManager($em), User::class);
$refreshedUser = $provider->refreshUser($user);
- if (\PHP_VERSION_ID >= 80400 && method_exists(Configuration::class, 'enableNativeLazyObjects')) {
+ if (method_exists(Configuration::class, 'enableNativeLazyObjects')) {
$this->assertFalse((new \ReflectionClass(User::class))->isUninitializedLazyObject($refreshedUser));
$this->assertSame('user1', $refreshedUser->name);
} else {
diff --git a/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/php_deprecation_from_vendor_class.phpt b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/php_deprecation_from_vendor_class.phpt
index 1ead2ef4a4013..3048efbfab53a 100644
--- a/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/php_deprecation_from_vendor_class.phpt
+++ b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/php_deprecation_from_vendor_class.phpt
@@ -1,7 +1,5 @@
--TEST--
Test that a PHP deprecation from a vendor class autoload is considered indirect.
---SKIPIF--
-
--FILE--
= 80000) {
- $PHPUNIT_VERSION = $getEnvVar('SYMFONY_PHPUNIT_VERSION', '9.6') ?: '9.6';
-} else {
- $PHPUNIT_VERSION = $getEnvVar('SYMFONY_PHPUNIT_VERSION', '8.5') ?: '8.5';
-}
+$PHPUNIT_VERSION = $getEnvVar('SYMFONY_PHPUNIT_VERSION', '9.6') ?: '9.6';
$MAX_PHPUNIT_VERSION = $getEnvVar('SYMFONY_MAX_PHPUNIT_VERSION', false);
@@ -178,7 +174,7 @@
$prevCacheDir = false;
}
}
-$SYMFONY_PHPUNIT_REMOVE = $getEnvVar('SYMFONY_PHPUNIT_REMOVE', 'phpspec/prophecy'.($PHPUNIT_VERSION < 6.0 ? ' symfony/yaml' : ''));
+$SYMFONY_PHPUNIT_REMOVE = $getEnvVar('SYMFONY_PHPUNIT_REMOVE', 'phpspec/prophecy');
$SYMFONY_PHPUNIT_REQUIRE = $getEnvVar('SYMFONY_PHPUNIT_REQUIRE', '');
$configurationHash = md5(implode(\PHP_EOL, [md5_file(__FILE__), $SYMFONY_PHPUNIT_REMOVE, $SYMFONY_PHPUNIT_REQUIRE, (int) $PHPUNIT_REMOVE_RETURN_TYPEHINT]));
$PHPUNIT_VERSION_DIR = sprintf('phpunit-%s-%d', $PHPUNIT_VERSION, $PHPUNIT_REMOVE_RETURN_TYPEHINT);
@@ -240,9 +236,6 @@
if ($SYMFONY_PHPUNIT_REQUIRE) {
$passthruOrFail("$COMPOSER require --no-update ".$SYMFONY_PHPUNIT_REQUIRE);
}
- if (5.1 <= $PHPUNIT_VERSION && $PHPUNIT_VERSION < 5.4) {
- $passthruOrFail("$COMPOSER require --no-update phpunit/phpunit-mock-objects \"~3.1.0\"");
- }
if (preg_match('{\^((\d++\.)\d++)[\d\.]*$}', $info['requires']['php'], $phpVersion) && version_compare($phpVersion[2].'99', \PHP_VERSION, '<')) {
$passthruOrFail("$COMPOSER config platform.php \"$phpVersion[1].99\"");
@@ -267,9 +260,8 @@
}
$prevRoot = getenv('COMPOSER_ROOT_VERSION');
putenv("COMPOSER_ROOT_VERSION=$PHPUNIT_VERSION.99");
- $q = '\\' === \DIRECTORY_SEPARATOR && \PHP_VERSION_ID < 80000 ? '"' : '';
// --no-suggest is not in the list to keep compat with composer 1.0, which is shipped with Ubuntu 16.04LTS
- $exit = proc_close(proc_open("$q$COMPOSER update --no-dev --prefer-dist --no-progress $q", [], $p, getcwd()));
+ $exit = proc_close(proc_open("$COMPOSER update --no-dev --prefer-dist --no-progress", [], $p, getcwd()));
putenv('COMPOSER_ROOT_VERSION'.(false !== $prevRoot ? '='.$prevRoot : ''));
if ($prevCacheDir) {
putenv("COMPOSER_CACHE_DIR=$prevCacheDir");
@@ -340,16 +332,7 @@ class_exists(\SymfonyExcludeListSimplePhpunit::class, false) && PHPUnit\Util\Bla
}
chdir($oldPwd);
-if ($PHPUNIT_VERSION < 8.0) {
- $argv = array_filter($argv, function ($v) use (&$argc) {
- if ('--do-not-cache-result' !== $v) {
- return true;
- }
- --$argc;
-
- return false;
- });
-} elseif (filter_var(getenv('SYMFONY_PHPUNIT_DISABLE_RESULT_CACHE'), \FILTER_VALIDATE_BOOLEAN)) {
+if (filter_var(getenv('SYMFONY_PHPUNIT_DISABLE_RESULT_CACHE'), \FILTER_VALIDATE_BOOLEAN)) {
$argv[] = '--do-not-cache-result';
++$argc;
}
diff --git a/src/Symfony/Bridge/PhpUnit/bootstrap.php b/src/Symfony/Bridge/PhpUnit/bootstrap.php
index 24d593406c87a..5540904749aa9 100644
--- a/src/Symfony/Bridge/PhpUnit/bootstrap.php
+++ b/src/Symfony/Bridge/PhpUnit/bootstrap.php
@@ -9,7 +9,6 @@
* file that was distributed with this source code.
*/
-use Doctrine\Common\Annotations\AnnotationRegistry;
use Doctrine\Deprecations\Deprecation;
use Symfony\Bridge\PhpUnit\DeprecationErrorHandler;
@@ -35,19 +34,6 @@
if (class_exists(Deprecation::class)) {
Deprecation::withoutDeduplication();
-
- if (\PHP_VERSION_ID < 80000) {
- // Ignore deprecations about the annotation mapping driver when it's not possible to move to the attribute driver yet
- Deprecation::ignoreDeprecations('https://github.com/doctrine/orm/issues/10098');
- }
-}
-
-if (!class_exists(AnnotationRegistry::class, false) && class_exists(AnnotationRegistry::class)) {
- if (method_exists(AnnotationRegistry::class, 'registerUniqueLoader')) {
- AnnotationRegistry::registerUniqueLoader('class_exists');
- } elseif (method_exists(AnnotationRegistry::class, 'registerLoader')) {
- AnnotationRegistry::registerLoader('class_exists');
- }
}
if (
diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php
index 937ba2d2c89ec..7674c97387a6d 100644
--- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php
+++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php
@@ -2131,11 +2131,6 @@ private function registerJsonStreamerConfiguration(array $config, ContainerBuild
$container->setParameter('.json_streamer.stream_writers_dir', '%kernel.cache_dir%/json_streamer/stream_writer');
$container->setParameter('.json_streamer.stream_readers_dir', '%kernel.cache_dir%/json_streamer/stream_reader');
- $container->setParameter('.json_streamer.lazy_ghosts_dir', '%kernel.cache_dir%/json_streamer/lazy_ghost');
-
- if (\PHP_VERSION_ID >= 80400) {
- $container->removeDefinition('.json_streamer.cache_warmer.lazy_ghost');
- }
}
private function registerPropertyInfoConfiguration(array $config, ContainerBuilder $container, PhpFileLoader $loader): void
diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/json_streamer.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/json_streamer.php
index 79fb25833e066..4b38f0a506176 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/json_streamer.php
+++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/json_streamer.php
@@ -38,7 +38,6 @@
tagged_locator('json_streamer.value_transformer'),
service('json_streamer.read.property_metadata_loader'),
param('.json_streamer.stream_readers_dir'),
- param('.json_streamer.lazy_ghosts_dir'),
])
->alias(JsonStreamWriter::class, 'json_streamer.stream_writer')
->alias(JsonStreamReader::class, 'json_streamer.stream_reader')
@@ -108,12 +107,5 @@
service('logger')->ignoreOnInvalid(),
])
->tag('kernel.cache_warmer')
-
- ->set('.json_streamer.cache_warmer.lazy_ghost', LazyGhostCacheWarmer::class)
- ->args([
- abstract_arg('streamable class names'),
- param('.json_streamer.lazy_ghosts_dir'),
- ])
- ->tag('kernel.cache_warmer')
;
};
diff --git a/src/Symfony/Bundle/WebProfilerBundle/Profiler/CodeExtension.php b/src/Symfony/Bundle/WebProfilerBundle/Profiler/CodeExtension.php
index 332a5d6c3725e..3ca805dfa1e80 100644
--- a/src/Symfony/Bundle/WebProfilerBundle/Profiler/CodeExtension.php
+++ b/src/Symfony/Bundle/WebProfilerBundle/Profiler/CodeExtension.php
@@ -123,21 +123,13 @@ public function fileExcerpt(string $file, int $line, int $srcContext = 3): ?stri
// highlight_file could throw warnings
// see https://bugs.php.net/25725
$code = @highlight_file($file, true);
- if (\PHP_VERSION_ID >= 80300) {
- // remove main pre/code tags
- $code = preg_replace('#^
\s*(.*)\s*#s', '\\1', $code);
- // split multiline span tags
- $code = preg_replace_callback('#]++)>((?:[^<\\n]*+\\n)++[^<]*+)#', function ($m) {
- return "".str_replace("\n", "\n", $m[2]).'';
- }, $code);
- $content = explode("\n", $code);
- } else {
- // remove main code/span tags
- $code = preg_replace('#^\s*(.*)\s*#s', '\\1', $code);
- // split multiline spans
- $code = preg_replace_callback('#]++)>((?:[^<]*+
)++[^<]*+)#', fn ($m) => "".str_replace('
', "
", $m[2]).'', $code);
- $content = explode('
', $code);
- }
+ // remove main pre/code tags
+ $code = preg_replace('#^\s*(.*)\s*#s', '\\1', $code);
+ // split multiline span tags
+ $code = preg_replace_callback('#]++)>((?:[^<\\n]*+\\n)++[^<]*+)#', function ($m) {
+ return "".str_replace("\n", "\n", $m[2]).'';
+ }, $code);
+ $content = explode("\n", $code);
$lines = [];
if (0 > $srcContext) {
diff --git a/src/Symfony/Component/Clock/Clock.php b/src/Symfony/Component/Clock/Clock.php
index 311e8fc07abd0..c00a43921de3e 100644
--- a/src/Symfony/Component/Clock/Clock.php
+++ b/src/Symfony/Component/Clock/Clock.php
@@ -71,14 +71,8 @@ public function sleep(float|int $seconds): void
*/
public function withTimeZone(\DateTimeZone|string $timezone): static
{
- if (\PHP_VERSION_ID >= 80300 && \is_string($timezone)) {
+ if (\is_string($timezone)) {
$timezone = new \DateTimeZone($timezone);
- } elseif (\is_string($timezone)) {
- try {
- $timezone = new \DateTimeZone($timezone);
- } catch (\Exception $e) {
- throw new \DateInvalidTimeZoneException($e->getMessage(), $e->getCode(), $e);
- }
}
$clone = clone $this;
diff --git a/src/Symfony/Component/Clock/DatePoint.php b/src/Symfony/Component/Clock/DatePoint.php
index 4df35fe037256..7b92b76fe6d5c 100644
--- a/src/Symfony/Component/Clock/DatePoint.php
+++ b/src/Symfony/Component/Clock/DatePoint.php
@@ -30,17 +30,8 @@ public function __construct(string $datetime = 'now', ?\DateTimeZone $timezone =
$now = static::createFromInterface($now);
}
- if (\PHP_VERSION_ID < 80300) {
- try {
- $builtInDate = new parent($datetime, $timezone ?? $now->getTimezone());
- $timezone = $builtInDate->getTimezone();
- } catch (\Exception $e) {
- throw new \DateMalformedStringException($e->getMessage(), $e->getCode(), $e);
- }
- } else {
- $builtInDate = new parent($datetime, $timezone ?? $now->getTimezone());
- $timezone = $builtInDate->getTimezone();
- }
+ $builtInDate = new parent($datetime, $timezone ?? $now->getTimezone());
+ $timezone = $builtInDate->getTimezone();
$now = $now->setTimezone($timezone)->modify($datetime);
@@ -74,23 +65,7 @@ public static function createFromMutable(\DateTime $object): static
public static function createFromTimestamp(int|float $timestamp): static
{
- if (\PHP_VERSION_ID >= 80400) {
- return parent::createFromTimestamp($timestamp);
- }
-
- if (\is_int($timestamp) || !$ms = (int) $timestamp - $timestamp) {
- return static::createFromFormat('U', (string) $timestamp);
- }
-
- if (!is_finite($timestamp) || \PHP_INT_MAX + 1.0 <= $timestamp || \PHP_INT_MIN > $timestamp) {
- throw new \DateRangeError(\sprintf('DateTimeImmutable::createFromTimestamp(): Argument #1 ($timestamp) must be a finite number between %s and %s.999999, %s given', \PHP_INT_MIN, \PHP_INT_MAX, $timestamp));
- }
-
- if ($timestamp < 0) {
- $timestamp = (int) $timestamp - 2.0 + $ms;
- }
-
- return static::createFromFormat('U.u', \sprintf('%.6F', $timestamp));
+ return parent::createFromTimestamp($timestamp);
}
public function add(\DateInterval $interval): static
@@ -108,10 +83,6 @@ public function sub(\DateInterval $interval): static
*/
public function modify(string $modifier): static
{
- if (\PHP_VERSION_ID < 80300) {
- return @parent::modify($modifier) ?: throw new \DateMalformedStringException(error_get_last()['message'] ?? \sprintf('Invalid modifier: "%s".', $modifier));
- }
-
return parent::modify($modifier);
}
@@ -151,19 +122,6 @@ public function setMicrosecond(int $microsecond): static
throw new \DateRangeError('DatePoint::setMicrosecond(): Argument #1 ($microsecond) must be between 0 and 999999, '.$microsecond.' given');
}
- if (\PHP_VERSION_ID < 80400) {
- return $this->setTime(...explode('.', $this->format('H.i.s.'.$microsecond)));
- }
-
return parent::setMicrosecond($microsecond);
}
-
- public function getMicrosecond(): int
- {
- if (\PHP_VERSION_ID >= 80400) {
- return parent::getMicrosecond();
- }
-
- return $this->format('u');
- }
}
diff --git a/src/Symfony/Component/Clock/MockClock.php b/src/Symfony/Component/Clock/MockClock.php
index 9ba2726bf3453..71500375638af 100644
--- a/src/Symfony/Component/Clock/MockClock.php
+++ b/src/Symfony/Component/Clock/MockClock.php
@@ -28,14 +28,8 @@ final class MockClock implements ClockInterface
*/
public function __construct(\DateTimeImmutable|string $now = 'now', \DateTimeZone|string|null $timezone = null)
{
- if (\PHP_VERSION_ID >= 80300 && \is_string($timezone)) {
+ if (\is_string($timezone)) {
$timezone = new \DateTimeZone($timezone);
- } elseif (\is_string($timezone)) {
- try {
- $timezone = new \DateTimeZone($timezone);
- } catch (\Exception $e) {
- throw new \DateInvalidTimeZoneException($e->getMessage(), $e->getCode(), $e);
- }
}
if (\is_string($now)) {
@@ -66,12 +60,6 @@ public function sleep(float|int $seconds): void
*/
public function modify(string $modifier): void
{
- if (\PHP_VERSION_ID < 80300) {
- $this->now = @$this->now->modify($modifier) ?: throw new \DateMalformedStringException(error_get_last()['message'] ?? \sprintf('Invalid modifier: "%s". Could not modify MockClock.', $modifier));
-
- return;
- }
-
$this->now = $this->now->modify($modifier);
}
@@ -80,7 +68,7 @@ public function modify(string $modifier): void
*/
public function withTimeZone(\DateTimeZone|string $timezone): static
{
- if (\PHP_VERSION_ID >= 80300 && \is_string($timezone)) {
+ if (\is_string($timezone)) {
$timezone = new \DateTimeZone($timezone);
} elseif (\is_string($timezone)) {
try {
diff --git a/src/Symfony/Component/Clock/MonotonicClock.php b/src/Symfony/Component/Clock/MonotonicClock.php
index d27bf9c3134e0..15dc009ea63b2 100644
--- a/src/Symfony/Component/Clock/MonotonicClock.php
+++ b/src/Symfony/Component/Clock/MonotonicClock.php
@@ -75,14 +75,8 @@ public function sleep(float|int $seconds): void
*/
public function withTimeZone(\DateTimeZone|string $timezone): static
{
- if (\PHP_VERSION_ID >= 80300 && \is_string($timezone)) {
+ if (\is_string($timezone)) {
$timezone = new \DateTimeZone($timezone);
- } elseif (\is_string($timezone)) {
- try {
- $timezone = new \DateTimeZone($timezone);
- } catch (\Exception $e) {
- throw new \DateInvalidTimeZoneException($e->getMessage(), $e->getCode(), $e);
- }
}
$clone = clone $this;
diff --git a/src/Symfony/Component/Clock/NativeClock.php b/src/Symfony/Component/Clock/NativeClock.php
index b580a886cf566..208fd3574c4bd 100644
--- a/src/Symfony/Component/Clock/NativeClock.php
+++ b/src/Symfony/Component/Clock/NativeClock.php
@@ -49,14 +49,8 @@ public function sleep(float|int $seconds): void
*/
public function withTimeZone(\DateTimeZone|string $timezone): static
{
- if (\PHP_VERSION_ID >= 80300 && \is_string($timezone)) {
+ if (\is_string($timezone)) {
$timezone = new \DateTimeZone($timezone);
- } elseif (\is_string($timezone)) {
- try {
- $timezone = new \DateTimeZone($timezone);
- } catch (\Exception $e) {
- throw new \DateInvalidTimeZoneException($e->getMessage(), $e->getCode(), $e);
- }
}
$clone = clone $this;
diff --git a/src/Symfony/Component/DependencyInjection/LazyProxy/Instantiator/LazyServiceInstantiator.php b/src/Symfony/Component/DependencyInjection/LazyProxy/Instantiator/LazyServiceInstantiator.php
index 10748256261e0..77b3def32f818 100644
--- a/src/Symfony/Component/DependencyInjection/LazyProxy/Instantiator/LazyServiceInstantiator.php
+++ b/src/Symfony/Component/DependencyInjection/LazyProxy/Instantiator/LazyServiceInstantiator.php
@@ -29,12 +29,12 @@ public function instantiateProxy(ContainerInterface $container, Definition $defi
throw new InvalidArgumentException(\sprintf('Cannot instantiate lazy proxy for service "%s".', $id));
}
- if (\PHP_VERSION_ID >= 80400 && $asGhostObject) {
- return (new \ReflectionClass($definition->getClass()))->newLazyGhost(static function ($ghost) use ($realInstantiator) { $realInstantiator($ghost); });
+ if ($asGhostObject) {
+ return new \ReflectionClass($definition->getClass())->newLazyGhost(static function ($ghost) use ($realInstantiator) { $realInstantiator($ghost); });
}
$class = null;
- if (!class_exists($proxyClass = $dumper->getProxyClass($definition, $asGhostObject, $class), false)) {
+ if (!class_exists($proxyClass = $dumper->getProxyClass($definition, false, $class), false)) {
eval($dumper->getProxyCode($definition, $id));
}
@@ -42,6 +42,6 @@ public function instantiateProxy(ContainerInterface $container, Definition $defi
return $class->newLazyProxy($realInstantiator);
}
- return \PHP_VERSION_ID < 80400 && $asGhostObject ? $proxyClass::createLazyGhost($realInstantiator) : $proxyClass::createLazyProxy($realInstantiator);
+ return $proxyClass::createLazyProxy($realInstantiator);
}
}
diff --git a/src/Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/LazyServiceDumper.php b/src/Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/LazyServiceDumper.php
index 0933c1a5993f6..2aefe78b0dcb5 100644
--- a/src/Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/LazyServiceDumper.php
+++ b/src/Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/LazyServiceDumper.php
@@ -56,15 +56,6 @@ public function isProxyCandidate(Definition $definition, ?bool &$asGhostObject =
}
}
- if (\PHP_VERSION_ID < 80400) {
- try {
- $asGhostObject = (bool) ProxyHelper::generateLazyGhost(new \ReflectionClass($class));
- } catch (LogicException) {
- }
-
- return true;
- }
-
try {
$asGhostObject = (bool) (new \ReflectionClass($class))->newLazyGhost(static fn () => null);
} catch (\Error $e) {
@@ -107,18 +98,6 @@ public function getProxyFactoryCode(Definition $definition, string $id, string $
EOF;
}
- if (\PHP_VERSION_ID < 80400) {
- $factoryCode = \sprintf('static fn ($proxy) => %s', $factoryCode);
-
- return <<createProxy('$proxyClass', static fn () => \\$proxyClass::createLazyGhost($factoryCode));
- }
-
-
- EOF;
- }
-
$factoryCode = \sprintf('static function ($proxy) use ($container) { %s; }', $factoryCode);
return <<getProxyClass($definition, $asGhostObject, $class);
if ($asGhostObject) {
- if (\PHP_VERSION_ID >= 80400) {
- return '';
- }
-
- try {
- return ($class?->isReadOnly() ? 'readonly ' : '').'class '.$proxyClass.ProxyHelper::generateLazyGhost($class);
- } catch (LogicException $e) {
- throw new InvalidArgumentException(\sprintf('Cannot generate lazy ghost for service "%s".', $id ?? $definition->getClass()), 0, $e);
- }
+ return '';
}
if ($definition->getClass() === $proxyClass) {
@@ -187,12 +158,6 @@ public function getProxyClass(Definition $definition, bool $asGhostObject, ?\Ref
$class = 'object' !== $definition->getClass() ? $definition->getClass() : 'stdClass';
$class = new \ReflectionClass($class);
- if (\PHP_VERSION_ID < 80400) {
- return preg_replace('/^.*\\\\/', '', $definition->getClass())
- .($asGhostObject ? 'Ghost' : 'Proxy')
- .ucfirst(substr(hash('xxh128', $this->salt.'+'.$class->name.'+'.serialize($definition->getTag('proxy'))), -7));
- }
-
if ($asGhostObject) {
return $class->name;
}
diff --git a/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php b/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php
index 774b1f88b66e7..8360cc3679772 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php
@@ -1951,11 +1951,7 @@ public function testLazyWither()
$container->compile();
$wither = $container->get('wither');
- if (\PHP_VERSION_ID >= 80400) {
- $this->assertTrue((new \ReflectionClass($wither))->isUninitializedLazyObject($wither));
- } else {
- $this->assertTrue($wither->resetLazyObject());
- }
+ $this->assertTrue((new \ReflectionClass($wither))->isUninitializedLazyObject($wither));
$this->assertInstanceOf(Foo::class, $wither->foo);
$this->assertInstanceOf(Wither::class, $wither->withFoo1($wither->foo));
}
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php b/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php
index a117a69a02cf8..9b41b2776d785 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php
@@ -340,7 +340,7 @@ public function testDumpAsFilesWithLazyFactoriesInlined()
if ('\\' === \DIRECTORY_SEPARATOR) {
$dump = str_replace("'.\\DIRECTORY_SEPARATOR.'", '/', $dump);
}
- $this->assertStringMatchesFormatFile(self::$fixturesPath.'/php/'.(\PHP_VERSION_ID < 80400 ? 'legacy_' : '').'services9_lazy_inlined_factories.txt', $dump);
+ $this->assertStringMatchesFormatFile(self::$fixturesPath.'/php/services9_lazy_inlined_factories.txt', $dump);
}
public function testServicesWithAnonymousFactories()
@@ -794,7 +794,7 @@ public function testNonSharedLazy()
'inline_class_loader' => false,
]);
$this->assertStringEqualsFile(
- self::$fixturesPath.'/php/'.(\PHP_VERSION_ID < 80400 ? 'legacy_' : '').'services_non_shared_lazy_public.php',
+ self::$fixturesPath.'/php/services_non_shared_lazy_public.php',
'\\' === \DIRECTORY_SEPARATOR ? str_replace("'.\\DIRECTORY_SEPARATOR.'", '/', $dump) : $dump
);
eval('?>'.$dump);
@@ -802,18 +802,10 @@ public function testNonSharedLazy()
$container = new \Symfony_DI_PhpDumper_Service_Non_Shared_Lazy();
$foo1 = $container->get('foo');
- if (\PHP_VERSION_ID >= 80400) {
- $this->assertTrue((new \ReflectionClass($foo1))->isUninitializedLazyObject($foo1));
- } else {
- $this->assertTrue($foo1->resetLazyObject());
- }
+ $this->assertTrue((new \ReflectionClass($foo1))->isUninitializedLazyObject($foo1));
$foo2 = $container->get('foo');
- if (\PHP_VERSION_ID >= 80400) {
- $this->assertTrue((new \ReflectionClass($foo2))->isUninitializedLazyObject($foo2));
- } else {
- $this->assertTrue($foo2->resetLazyObject());
- }
+ $this->assertTrue((new \ReflectionClass($foo2))->isUninitializedLazyObject($foo2));
$this->assertNotSame($foo1, $foo2);
}
@@ -840,7 +832,7 @@ public function testNonSharedLazyAsFiles()
$stringDump = print_r($dumps, true);
$this->assertStringMatchesFormatFile(
- self::$fixturesPath.'/php/'.(\PHP_VERSION_ID < 80400 ? 'legacy_' : '').'services_non_shared_lazy_as_files.txt',
+ self::$fixturesPath.'/php/services_non_shared_lazy_as_files.txt',
'\\' === \DIRECTORY_SEPARATOR ? str_replace("'.\\DIRECTORY_SEPARATOR.'", '/', $stringDump) : $stringDump
);
@@ -852,18 +844,10 @@ public function testNonSharedLazyAsFiles()
$container = eval('?>'.$lastDump);
$foo1 = $container->get('non_shared_foo');
- if (\PHP_VERSION_ID >= 80400) {
- $this->assertTrue((new \ReflectionClass($foo1))->isUninitializedLazyObject($foo1));
- } else {
- $this->assertTrue($foo1->resetLazyObject());
- }
+ $this->assertTrue((new \ReflectionClass($foo1))->isUninitializedLazyObject($foo1));
$foo2 = $container->get('non_shared_foo');
- if (\PHP_VERSION_ID >= 80400) {
- $this->assertTrue((new \ReflectionClass($foo2))->isUninitializedLazyObject($foo2));
- } else {
- $this->assertTrue($foo2->resetLazyObject());
- }
+ $this->assertTrue((new \ReflectionClass($foo2))->isUninitializedLazyObject($foo2));
$this->assertNotSame($foo1, $foo2);
}
@@ -885,7 +869,7 @@ public function testNonSharedLazyDefinitionReferences(bool $asGhostObject)
$dumper->setProxyDumper(new \DummyProxyDumper());
}
- $this->assertStringEqualsFile(self::$fixturesPath.'/php/'.(\PHP_VERSION_ID < 80400 ? 'legacy_' : '').'services_non_shared_lazy'.($asGhostObject ? '_ghost' : '').'.php', $dumper->dump());
+ $this->assertStringEqualsFile(self::$fixturesPath.'/php/services_non_shared_lazy'.($asGhostObject ? '_ghost' : '').'.php', $dumper->dump());
}
public function testNonSharedDuplicates()
@@ -958,7 +942,7 @@ public function testDedupLazyProxy()
$dumper = new PhpDumper($container);
- $this->assertStringEqualsFile(self::$fixturesPath.'/php/'.(\PHP_VERSION_ID < 80400 ? 'legacy_' : '').'services_dedup_lazy.php', $dumper->dump());
+ $this->assertStringEqualsFile(self::$fixturesPath.'/php/services_dedup_lazy.php', $dumper->dump());
}
public function testLazyArgumentProvideGenerator()
@@ -1623,17 +1607,13 @@ public function testLazyWither()
$container->compile();
$dumper = new PhpDumper($container);
$dump = $dumper->dump(['class' => 'Symfony_DI_PhpDumper_Service_Wither_Lazy']);
- $this->assertStringEqualsFile(self::$fixturesPath.'/php/'.(\PHP_VERSION_ID < 80400 ? 'legacy_' : '').'services_wither_lazy.php', $dump);
+ $this->assertStringEqualsFile(self::$fixturesPath.'/php/services_wither_lazy.php', $dump);
eval('?>'.$dump);
$container = new \Symfony_DI_PhpDumper_Service_Wither_Lazy();
$wither = $container->get('wither');
- if (\PHP_VERSION_ID >= 80400) {
- $this->assertTrue((new \ReflectionClass($wither))->isUninitializedLazyObject($wither));
- } else {
- $this->assertTrue($wither->resetLazyObject());
- }
+ $this->assertTrue((new \ReflectionClass($wither))->isUninitializedLazyObject($wither));
$this->assertInstanceOf(Foo::class, $wither->foo);
}
@@ -1652,25 +1632,17 @@ public function testLazyWitherNonShared()
$container->compile();
$dumper = new PhpDumper($container);
$dump = $dumper->dump(['class' => 'Symfony_DI_PhpDumper_Service_Wither_Lazy_Non_Shared']);
- $this->assertStringEqualsFile(self::$fixturesPath.'/php/'.(\PHP_VERSION_ID < 80400 ? 'legacy_' : '').'services_wither_lazy_non_shared.php', $dump);
+ $this->assertStringEqualsFile(self::$fixturesPath.'/php/services_wither_lazy_non_shared.php', $dump);
eval('?>'.$dump);
$container = new \Symfony_DI_PhpDumper_Service_Wither_Lazy_Non_Shared();
$wither1 = $container->get('wither');
- if (\PHP_VERSION_ID >= 80400) {
- $this->assertTrue((new \ReflectionClass($wither1))->isUninitializedLazyObject($wither1));
- } else {
- $this->assertTrue($wither1->resetLazyObject());
- }
+ $this->assertTrue((new \ReflectionClass($wither1))->isUninitializedLazyObject($wither1));
$this->assertInstanceOf(Foo::class, $wither1->foo);
$wither2 = $container->get('wither');
- if (\PHP_VERSION_ID >= 80400) {
- $this->assertTrue((new \ReflectionClass($wither2))->isUninitializedLazyObject($wither2));
- } else {
- $this->assertTrue($wither2->resetLazyObject());
- }
+ $this->assertTrue((new \ReflectionClass($wither2))->isUninitializedLazyObject($wither2));
$this->assertInstanceOf(Foo::class, $wither2->foo);
$this->assertNotSame($wither1, $wither2);
@@ -1999,21 +1971,16 @@ public function testLazyAutowireAttribute()
$container->compile();
$dumper = new PhpDumper($container);
- $this->assertStringEqualsFile(self::$fixturesPath.'/php/'.(\PHP_VERSION_ID < 80400 ? 'legacy_' : '').'lazy_autowire_attribute.php', $dumper->dump(['class' => 'Symfony_DI_PhpDumper_Test_Lazy_Autowire_Attribute']));
+ $this->assertStringEqualsFile(self::$fixturesPath.'/php/lazy_autowire_attribute.php', $dumper->dump(['class' => 'Symfony_DI_PhpDumper_Test_Lazy_Autowire_Attribute']));
- require self::$fixturesPath.'/php/'.(\PHP_VERSION_ID < 80400 ? 'legacy_' : '').'lazy_autowire_attribute.php';
+ require self::$fixturesPath.'/php/lazy_autowire_attribute.php';
$container = new \Symfony_DI_PhpDumper_Test_Lazy_Autowire_Attribute();
$this->assertInstanceOf(Foo::class, $container->get('bar')->foo);
- if (\PHP_VERSION_ID >= 80400) {
- $r = new \ReflectionClass(Foo::class);
- $this->assertTrue($r->isUninitializedLazyObject($container->get('bar')->foo));
- $this->assertSame($container->get('foo'), $r->initializeLazyObject($container->get('bar')->foo));
- } else {
- $this->assertInstanceOf(LazyObjectInterface::class, $container->get('bar')->foo);
- $this->assertSame($container->get('foo'), $container->get('bar')->foo->initializeLazyObject());
- }
+ $r = new \ReflectionClass(Foo::class);
+ $this->assertTrue($r->isUninitializedLazyObject($container->get('bar')->foo));
+ $this->assertSame($container->get('foo'), $r->initializeLazyObject($container->get('bar')->foo));
}
public function testLazyAutowireAttributeWithIntersection()
@@ -2036,11 +2003,7 @@ public function testLazyAutowireAttributeWithIntersection()
$dumper = new PhpDumper($container);
- if (\PHP_VERSION_ID >= 80400) {
- $this->assertStringEqualsFile(self::$fixturesPath.'/php/lazy_autowire_attribute_with_intersection.php', $dumper->dump());
- } else {
- $this->assertStringEqualsFile(self::$fixturesPath.'/php/legacy_lazy_autowire_attribute_with_intersection.php', $dumper->dump());
- }
+ $this->assertStringEqualsFile(self::$fixturesPath.'/php/lazy_autowire_attribute_with_intersection.php', $dumper->dump());
}
public function testCallableAdapterConsumer()
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_lazy_autowire_attribute.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_lazy_autowire_attribute.php
deleted file mode 100644
index 6cf1c86a52ade..0000000000000
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_lazy_autowire_attribute.php
+++ /dev/null
@@ -1,99 +0,0 @@
-services = $this->privates = [];
- $this->methodMap = [
- 'bar' => 'getBarService',
- 'foo' => 'getFooService',
- ];
-
- $this->aliases = [];
- }
-
- public function compile(): void
- {
- throw new LogicException('You cannot compile a dumped container that was already compiled.');
- }
-
- public function isCompiled(): bool
- {
- return true;
- }
-
- public function getRemovedIds(): array
- {
- return [
- 'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\Foo' => true,
- ];
- }
-
- protected function createProxy($class, \Closure $factory)
- {
- return $factory();
- }
-
- /**
- * Gets the public 'bar' shared autowired service.
- *
- * @return \Symfony\Component\DependencyInjection\Tests\Dumper\LazyServiceConsumer
- */
- protected static function getBarService($container)
- {
- return $container->services['bar'] = new \Symfony\Component\DependencyInjection\Tests\Dumper\LazyServiceConsumer(($container->privates['.lazy.Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\Foo'] ?? self::getFoo2Service($container)));
- }
-
- /**
- * Gets the public 'foo' shared service.
- *
- * @return \Symfony\Component\DependencyInjection\Tests\Compiler\Foo
- */
- protected static function getFooService($container)
- {
- return $container->services['foo'] = new \Symfony\Component\DependencyInjection\Tests\Compiler\Foo();
- }
-
- /**
- * Gets the private '.lazy.Symfony\Component\DependencyInjection\Tests\Compiler\Foo' shared service.
- *
- * @return \Symfony\Component\DependencyInjection\Tests\Compiler\Foo
- */
- protected static function getFoo2Service($container, $lazyLoad = true)
- {
- if (true === $lazyLoad) {
- return $container->privates['.lazy.Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\Foo'] = $container->createProxy('FooProxyCd8d23a', static fn () => \FooProxyCd8d23a::createLazyProxy(static fn () => self::getFoo2Service($container, false)));
- }
-
- return ($container->services['foo'] ??= new \Symfony\Component\DependencyInjection\Tests\Compiler\Foo());
- }
-}
-
-class FooProxyCd8d23a extends \Symfony\Component\DependencyInjection\Tests\Compiler\Foo implements \Symfony\Component\VarExporter\LazyObjectInterface
-{
- use \Symfony\Component\VarExporter\LazyProxyTrait;
-
- private const LAZY_OBJECT_PROPERTY_SCOPES = [
- 'foo' => [parent::class, 'foo', null, 4],
- ];
-}
-
-// Help opcache.preload discover always-needed symbols
-class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_lazy_autowire_attribute_with_intersection.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_lazy_autowire_attribute_with_intersection.php
deleted file mode 100644
index fcf66ad12157b..0000000000000
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_lazy_autowire_attribute_with_intersection.php
+++ /dev/null
@@ -1,94 +0,0 @@
-services = $this->privates = [];
- $this->methodMap = [
- 'foo' => 'getFooService',
- ];
-
- $this->aliases = [];
- }
-
- public function compile(): void
- {
- throw new LogicException('You cannot compile a dumped container that was already compiled.');
- }
-
- public function isCompiled(): bool
- {
- return true;
- }
-
- protected function createProxy($class, \Closure $factory)
- {
- return $factory();
- }
-
- /**
- * Gets the public 'foo' shared autowired service.
- *
- * @return \Symfony\Component\DependencyInjection\Tests\Compiler\AAndIInterfaceConsumer
- */
- protected static function getFooService($container)
- {
- $a = ($container->privates['.lazy.foo.qFdMZVK'] ?? self::get_Lazy_Foo_QFdMZVKService($container));
-
- if (isset($container->services['foo'])) {
- return $container->services['foo'];
- }
-
- return $container->services['foo'] = new \Symfony\Component\DependencyInjection\Tests\Compiler\AAndIInterfaceConsumer($a);
- }
-
- /**
- * Gets the private '.lazy.foo.qFdMZVK' shared service.
- *
- * @return \object
- */
- protected static function get_Lazy_Foo_QFdMZVKService($container, $lazyLoad = true)
- {
- if (true === $lazyLoad) {
- return $container->privates['.lazy.foo.qFdMZVK'] = $container->createProxy('objectProxy1fd6daa', static fn () => \objectProxy1fd6daa::createLazyProxy(static fn () => self::get_Lazy_Foo_QFdMZVKService($container, false)));
- }
-
- return ($container->services['foo'] ?? self::getFooService($container));
- }
-}
-
-class objectProxy1fd6daa implements \Symfony\Component\DependencyInjection\Tests\Compiler\AInterface, \Symfony\Component\DependencyInjection\Tests\Compiler\IInterface, \Symfony\Component\VarExporter\LazyObjectInterface
-{
- use \Symfony\Component\VarExporter\LazyProxyTrait;
-
- private const LAZY_OBJECT_PROPERTY_SCOPES = [];
-
- public function initializeLazyObject(): \Symfony\Component\DependencyInjection\Tests\Compiler\AInterface&\Symfony\Component\DependencyInjection\Tests\Compiler\IInterface
- {
- if ($state = $this->lazyObjectState ?? null) {
- return $state->realInstance ??= ($state->initializer)();
- }
-
- return $this;
- }
-}
-
-// Help opcache.preload discover always-needed symbols
-class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services9_lazy_inlined_factories.txt b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services9_lazy_inlined_factories.txt
deleted file mode 100644
index f945fdd50069b..0000000000000
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services9_lazy_inlined_factories.txt
+++ /dev/null
@@ -1,196 +0,0 @@
-Array
-(
- [Container%s/proxy-classes.php] => targetDir.''.'/Fixtures/includes/foo.php';
-
-class FooClassGhost1728205 extends \Bar\FooClass implements \Symfony\Component\VarExporter\LazyObjectInterface
-%A
-
-if (!\class_exists('FooClassGhost1728205', false)) {
- \class_alias(__NAMESPACE__.'\\FooClassGhost1728205', 'FooClassGhost1728205', false);
-}
-
- [Container%s/ProjectServiceContainer.php] => targetDir = \dirname($containerDir);
- $this->parameters = $this->getDefaultParameters();
-
- $this->services = $this->privates = [];
- $this->methodMap = [
- 'lazy_foo' => 'getLazyFooService',
- ];
-
- $this->aliases = [];
-
- $this->privates['service_container'] = static function ($container) {
- include_once __DIR__.'/proxy-classes.php';
- };
- }
-
- public function compile(): void
- {
- throw new LogicException('You cannot compile a dumped container that was already compiled.');
- }
-
- public function isCompiled(): bool
- {
- return true;
- }
-
- protected function createProxy($class, \Closure $factory)
- {
- return $factory();
- }
-
- /**
- * Gets the public 'lazy_foo' shared service.
- *
- * @return \Bar\FooClass
- */
- protected static function getLazyFooService($container, $lazyLoad = true)
- {
- if (true === $lazyLoad) {
- return $container->services['lazy_foo'] = $container->createProxy('FooClassGhost1728205', static fn () => \FooClassGhost1728205::createLazyGhost(static fn ($proxy) => self::getLazyFooService($container, $proxy)));
- }
-
- include_once $container->targetDir.''.'/Fixtures/includes/foo_lazy.php';
-
- return ($lazyLoad->__construct(new \Bar\FooLazyClass()) && false ?: $lazyLoad);
- }
-
- public function getParameter(string $name): array|bool|string|int|float|\UnitEnum|null
- {
- if (isset($this->buildParameters[$name])) {
- return $this->buildParameters[$name];
- }
-
- if (!(isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || \array_key_exists($name, $this->parameters))) {
- throw new ParameterNotFoundException($name);
- }
-
- if (isset($this->loadedDynamicParameters[$name])) {
- $value = $this->loadedDynamicParameters[$name] ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name);
- } else {
- $value = $this->parameters[$name];
- }
-
- return $value;
- }
-
- public function hasParameter(string $name): bool
- {
- if (isset($this->buildParameters[$name])) {
- return true;
- }
-
- return isset($this->parameters[$name]) || isset($this->loadedDynamicParameters[$name]) || \array_key_exists($name, $this->parameters);
- }
-
- public function setParameter(string $name, $value): void
- {
- throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
- }
-
- public function getParameterBag(): ParameterBagInterface
- {
- if (!isset($this->parameterBag)) {
- $parameters = $this->parameters;
- foreach ($this->loadedDynamicParameters as $name => $loaded) {
- $parameters[$name] = $loaded ? $this->dynamicParameters[$name] : $this->getDynamicParameter($name);
- }
- foreach ($this->buildParameters as $name => $value) {
- $parameters[$name] = $value;
- }
- $this->parameterBag = new FrozenParameterBag($parameters, []);
- }
-
- return $this->parameterBag;
- }
-
- private $loadedDynamicParameters = [];
- private $dynamicParameters = [];
-
- private function getDynamicParameter(string $name)
- {
- throw new ParameterNotFoundException($name);
- }
-
- protected function getDefaultParameters(): array
- {
- return [
- 'lazy_foo_class' => 'Bar\\FooClass',
- 'container.dumper.inline_factories' => true,
- 'container.dumper.inline_class_loader' => true,
- ];
- }
-}
-
- [ProjectServiceContainer.preload.php] => = 7.4 when preloading is desired
-
-use Symfony\Component\DependencyInjection\Dumper\Preloader;
-
-if (in_array(PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {
- return;
-}
-
-require dirname(__DIR__, %d).'%svendor/autoload.php';
-(require __DIR__.'/ProjectServiceContainer.php')->set(\Container%s\ProjectServiceContainer::class, null);
-
-$classes = [];
-$classes[] = 'Bar\FooClass';
-$classes[] = 'Bar\FooLazyClass';
-$classes[] = 'Symfony\Component\DependencyInjection\ContainerInterface';
-
-$preloaded = Preloader::preload($classes);
-
- [ProjectServiceContainer.php] => '%s',
- 'container.build_id' => '%s',
- 'container.build_time' => 1563381341,
- 'container.runtime_mode' => \in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true) ? 'web=0' : 'web=1',
-], __DIR__.\DIRECTORY_SEPARATOR.'Container%s');
-
-)
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_dedup_lazy.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_dedup_lazy.php
deleted file mode 100644
index 60add492ba1cd..0000000000000
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_dedup_lazy.php
+++ /dev/null
@@ -1,126 +0,0 @@
-services = $this->privates = [];
- $this->methodMap = [
- 'bar' => 'getBarService',
- 'baz' => 'getBazService',
- 'buz' => 'getBuzService',
- 'foo' => 'getFooService',
- ];
-
- $this->aliases = [];
- }
-
- public function compile(): void
- {
- throw new LogicException('You cannot compile a dumped container that was already compiled.');
- }
-
- public function isCompiled(): bool
- {
- return true;
- }
-
- protected function createProxy($class, \Closure $factory)
- {
- return $factory();
- }
-
- /**
- * Gets the public 'bar' shared service.
- *
- * @return \stdClass
- */
- protected static function getBarService($container, $lazyLoad = true)
- {
- if (true === $lazyLoad) {
- return $container->services['bar'] = $container->createProxy('stdClassGhostAa01f12', static fn () => \stdClassGhostAa01f12::createLazyGhost(static fn ($proxy) => self::getBarService($container, $proxy)));
- }
-
- return $lazyLoad;
- }
-
- /**
- * Gets the public 'baz' shared service.
- *
- * @return \stdClass
- */
- protected static function getBazService($container, $lazyLoad = true)
- {
- if (true === $lazyLoad) {
- return $container->services['baz'] = $container->createProxy('stdClassProxyAa01f12', static fn () => \stdClassProxyAa01f12::createLazyProxy(static fn () => self::getBazService($container, false)));
- }
-
- return \foo_bar();
- }
-
- /**
- * Gets the public 'buz' shared service.
- *
- * @return \stdClass
- */
- protected static function getBuzService($container, $lazyLoad = true)
- {
- if (true === $lazyLoad) {
- return $container->services['buz'] = $container->createProxy('stdClassProxyAa01f12', static fn () => \stdClassProxyAa01f12::createLazyProxy(static fn () => self::getBuzService($container, false)));
- }
-
- return \foo_bar();
- }
-
- /**
- * Gets the public 'foo' shared service.
- *
- * @return \stdClass
- */
- protected static function getFooService($container, $lazyLoad = true)
- {
- if (true === $lazyLoad) {
- return $container->services['foo'] = $container->createProxy('stdClassGhostAa01f12', static fn () => \stdClassGhostAa01f12::createLazyGhost(static fn ($proxy) => self::getFooService($container, $proxy)));
- }
-
- return $lazyLoad;
- }
-}
-
-class stdClassGhostAa01f12 extends \stdClass implements \Symfony\Component\VarExporter\LazyObjectInterface
-{
- use \Symfony\Component\VarExporter\LazyGhostTrait;
-
- private const LAZY_OBJECT_PROPERTY_SCOPES = [];
-}
-
-// Help opcache.preload discover always-needed symbols
-class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);
-
-class stdClassProxyAa01f12 extends \stdClass implements \Symfony\Component\VarExporter\LazyObjectInterface
-{
- use \Symfony\Component\VarExporter\LazyProxyTrait;
-
- private const LAZY_OBJECT_PROPERTY_SCOPES = [];
-}
-
-// Help opcache.preload discover always-needed symbols
-class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_non_shared_lazy.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_non_shared_lazy.php
deleted file mode 100644
index f584bef6b97cc..0000000000000
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_non_shared_lazy.php
+++ /dev/null
@@ -1,76 +0,0 @@
-services = $this->privates = [];
- $this->methodMap = [
- 'bar' => 'getBarService',
- ];
-
- $this->aliases = [];
- }
-
- public function compile(): void
- {
- throw new LogicException('You cannot compile a dumped container that was already compiled.');
- }
-
- public function isCompiled(): bool
- {
- return true;
- }
-
- public function getRemovedIds(): array
- {
- return [
- 'foo' => true,
- ];
- }
-
- protected function createProxy($class, \Closure $factory)
- {
- return $factory();
- }
-
- /**
- * Gets the public 'bar' shared service.
- *
- * @return \stdClass
- */
- protected static function getBarService($container)
- {
- return $container->services['bar'] = new \stdClass((isset($container->factories['service_container']['foo']) ? $container->factories['service_container']['foo']($container) : self::getFooService($container)));
- }
-
- /**
- * Gets the private 'foo' service.
- *
- * @return \stdClass
- */
- protected static function getFooService($container, $lazyLoad = true)
- {
- $container->factories['service_container']['foo'] ??= self::getFooService(...);
-
- // lazy factory for stdClass
-
- return new \stdClass();
- }
-}
-
-// proxy code for stdClass
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_non_shared_lazy_as_files.txt b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_non_shared_lazy_as_files.txt
deleted file mode 100644
index d52dd5a7b82ac..0000000000000
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_non_shared_lazy_as_files.txt
+++ /dev/null
@@ -1,173 +0,0 @@
-Array
-(
- [Container%s/getNonSharedFooService.php] => factories['non_shared_foo'] ??= fn () => self::do($container);
-
- if (true === $lazyLoad) {
- return $container->createProxy('FooLazyClassGhost%s', static fn () => \FooLazyClassGhost%s::createLazyGhost(static fn ($proxy) => self::do($container, $proxy)));
- }
-
- static $include = true;
-
- if ($include) {
- include_once '%sfoo_lazy.php';
-
- $include = false;
- }
-
- return $lazyLoad;
- }
-}
-
- [Container%s/FooLazyClassGhost%s.php] => [parent::class, 'foo', null, 4],
- ];
-}
-
-// Help opcache.preload discover always-needed symbols
-class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);
-
-if (!\class_exists('FooLazyClassGhost%s', false)) {
- \class_alias(__NAMESPACE__.'\\FooLazyClassGhost%s', 'FooLazyClassGhost%s', false);
-}
-
- [Container%s/Symfony_DI_PhpDumper_Service_Non_Shared_Lazy_As_File.php] => services = $this->privates = [];
- $this->fileMap = [
- 'non_shared_foo' => 'getNonSharedFooService',
- ];
-
- $this->aliases = [];
- }
-
- public function compile(): void
- {
- throw new LogicException('You cannot compile a dumped container that was already compiled.');
- }
-
- public function isCompiled(): bool
- {
- return true;
- }
-
- protected function load($file, $lazyLoad = true): mixed
- {
- if (class_exists($class = __NAMESPACE__.'\\'.$file, false)) {
- return $class::do($this, $lazyLoad);
- }
-
- if ('.' === $file[-4]) {
- $class = substr($class, 0, -4);
- } else {
- $file .= '.php';
- }
-
- $service = require $this->containerDir.\DIRECTORY_SEPARATOR.$file;
-
- return class_exists($class, false) ? $class::do($this, $lazyLoad) : $service;
- }
-
- protected function createProxy($class, \Closure $factory)
- {
- class_exists($class, false) || require __DIR__.'/'.$class.'.php';
-
- return $factory();
- }
-}
-
- [Symfony_DI_PhpDumper_Service_Non_Shared_Lazy_As_File.preload.php] => = 7.4 when preloading is desired
-
-use Symfony\Component\DependencyInjection\Dumper\Preloader;
-
-if (in_array(PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {
- return;
-}
-
-require '%svendor/autoload.php';
-(require __DIR__.'/Symfony_DI_PhpDumper_Service_Non_Shared_Lazy_As_File.php')->set(\Container%s\Symfony_DI_PhpDumper_Service_Non_Shared_Lazy_As_File::class, null);
-require __DIR__.'/Container%s/FooLazyClassGhost%s.php';
-require __DIR__.'/Container%s/getNonSharedFooService.php';
-
-$classes = [];
-$classes[] = 'Bar\FooLazyClass';
-$classes[] = 'Symfony\Component\DependencyInjection\ContainerInterface';
-
-$preloaded = Preloader::preload($classes);
-
- [Symfony_DI_PhpDumper_Service_Non_Shared_Lazy_As_File.php] => '%s',
- 'container.build_id' => '%s',
- 'container.build_time' => %d,
- 'container.runtime_mode' => \in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true) ? 'web=0' : 'web=1',
-], __DIR__.\DIRECTORY_SEPARATOR.'Container%s');
-
-)
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_non_shared_lazy_ghost.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_non_shared_lazy_ghost.php
deleted file mode 100644
index b03463295309e..0000000000000
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_non_shared_lazy_ghost.php
+++ /dev/null
@@ -1,88 +0,0 @@
-services = $this->privates = [];
- $this->methodMap = [
- 'bar' => 'getBarService',
- ];
-
- $this->aliases = [];
- }
-
- public function compile(): void
- {
- throw new LogicException('You cannot compile a dumped container that was already compiled.');
- }
-
- public function isCompiled(): bool
- {
- return true;
- }
-
- public function getRemovedIds(): array
- {
- return [
- 'foo' => true,
- ];
- }
-
- protected function createProxy($class, \Closure $factory)
- {
- return $factory();
- }
-
- /**
- * Gets the public 'bar' shared service.
- *
- * @return \stdClass
- */
- protected static function getBarService($container)
- {
- return $container->services['bar'] = new \stdClass((isset($container->factories['service_container']['foo']) ? $container->factories['service_container']['foo']($container) : self::getFooService($container)));
- }
-
- /**
- * Gets the private 'foo' service.
- *
- * @return \stdClass
- */
- protected static function getFooService($container, $lazyLoad = true)
- {
- $container->factories['service_container']['foo'] ??= self::getFooService(...);
-
- if (true === $lazyLoad) {
- return $container->createProxy('stdClassGhostAa01f12', static fn () => \stdClassGhostAa01f12::createLazyGhost(static fn ($proxy) => self::getFooService($container, $proxy)));
- }
-
- return $lazyLoad;
- }
-}
-
-class stdClassGhostAa01f12 extends \stdClass implements \Symfony\Component\VarExporter\LazyObjectInterface
-{
- use \Symfony\Component\VarExporter\LazyGhostTrait;
-
- private const LAZY_OBJECT_PROPERTY_SCOPES = [];
-}
-
-// Help opcache.preload discover always-needed symbols
-class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_non_shared_lazy_public.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_non_shared_lazy_public.php
deleted file mode 100644
index 0841cf192ef59..0000000000000
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_non_shared_lazy_public.php
+++ /dev/null
@@ -1,81 +0,0 @@
-services = $this->privates = [];
- $this->methodMap = [
- 'foo' => 'getFooService',
- ];
-
- $this->aliases = [];
- }
-
- public function compile(): void
- {
- throw new LogicException('You cannot compile a dumped container that was already compiled.');
- }
-
- public function isCompiled(): bool
- {
- return true;
- }
-
- protected function createProxy($class, \Closure $factory)
- {
- return $factory();
- }
-
- /**
- * Gets the public 'foo' service.
- *
- * @return \Bar\FooLazyClass
- */
- protected static function getFooService($container, $lazyLoad = true)
- {
- $container->factories['foo'] ??= fn () => self::getFooService($container);
-
- if (true === $lazyLoad) {
- return $container->createProxy('FooLazyClassGhost82ad1a4', static fn () => \FooLazyClassGhost82ad1a4::createLazyGhost(static fn ($proxy) => self::getFooService($container, $proxy)));
- }
-
- static $include = true;
-
- if ($include) {
- include_once __DIR__.'/Fixtures/includes/foo_lazy.php';
-
- $include = false;
- }
-
- return $lazyLoad;
- }
-}
-
-class FooLazyClassGhost82ad1a4 extends \Bar\FooLazyClass implements \Symfony\Component\VarExporter\LazyObjectInterface
-{
- use \Symfony\Component\VarExporter\LazyGhostTrait;
-
- private const LAZY_OBJECT_PROPERTY_SCOPES = [
- 'foo' => [parent::class, 'foo', null, 4],
- ];
-}
-
-// Help opcache.preload discover always-needed symbols
-class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_wither_lazy.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_wither_lazy.php
deleted file mode 100644
index b9e9164573672..0000000000000
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_wither_lazy.php
+++ /dev/null
@@ -1,86 +0,0 @@
-services = $this->privates = [];
- $this->methodMap = [
- 'wither' => 'getWitherService',
- ];
-
- $this->aliases = [];
- }
-
- public function compile(): void
- {
- throw new LogicException('You cannot compile a dumped container that was already compiled.');
- }
-
- public function isCompiled(): bool
- {
- return true;
- }
-
- public function getRemovedIds(): array
- {
- return [
- 'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\Foo' => true,
- ];
- }
-
- protected function createProxy($class, \Closure $factory)
- {
- return $factory();
- }
-
- /**
- * Gets the public 'wither' shared autowired service.
- *
- * @return \Symfony\Component\DependencyInjection\Tests\Compiler\Wither
- */
- protected static function getWitherService($container, $lazyLoad = true)
- {
- if (true === $lazyLoad) {
- return $container->services['wither'] = $container->createProxy('WitherProxy1991f2a', static fn () => \WitherProxy1991f2a::createLazyProxy(static fn () => self::getWitherService($container, false)));
- }
-
- $instance = new \Symfony\Component\DependencyInjection\Tests\Compiler\Wither();
-
- $a = ($container->privates['Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\Foo'] ??= new \Symfony\Component\DependencyInjection\Tests\Compiler\Foo());
-
- $instance = $instance->withFoo1($a);
- $instance = $instance->withFoo2($a);
- $instance->setFoo($a);
-
- return $instance;
- }
-}
-
-class WitherProxy1991f2a extends \Symfony\Component\DependencyInjection\Tests\Compiler\Wither implements \Symfony\Component\VarExporter\LazyObjectInterface
-{
- use \Symfony\Component\VarExporter\LazyProxyTrait;
-
- private const LAZY_OBJECT_PROPERTY_SCOPES = [
- 'foo' => [parent::class, 'foo', null, 4],
- ];
-}
-
-// Help opcache.preload discover always-needed symbols
-class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_wither_lazy_non_shared.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_wither_lazy_non_shared.php
deleted file mode 100644
index d70588f655329..0000000000000
--- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/legacy_services_wither_lazy_non_shared.php
+++ /dev/null
@@ -1,88 +0,0 @@
-services = $this->privates = [];
- $this->methodMap = [
- 'wither' => 'getWitherService',
- ];
-
- $this->aliases = [];
- }
-
- public function compile(): void
- {
- throw new LogicException('You cannot compile a dumped container that was already compiled.');
- }
-
- public function isCompiled(): bool
- {
- return true;
- }
-
- public function getRemovedIds(): array
- {
- return [
- 'Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\Foo' => true,
- ];
- }
-
- protected function createProxy($class, \Closure $factory)
- {
- return $factory();
- }
-
- /**
- * Gets the public 'wither' autowired service.
- *
- * @return \Symfony\Component\DependencyInjection\Tests\Compiler\Wither
- */
- protected static function getWitherService($container, $lazyLoad = true)
- {
- $container->factories['wither'] ??= fn () => self::getWitherService($container);
-
- if (true === $lazyLoad) {
- return $container->createProxy('WitherProxyE94fdba', static fn () => \WitherProxyE94fdba::createLazyProxy(static fn () => self::getWitherService($container, false)));
- }
-
- $instance = new \Symfony\Component\DependencyInjection\Tests\Compiler\Wither();
-
- $a = ($container->privates['Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\Foo'] ??= new \Symfony\Component\DependencyInjection\Tests\Compiler\Foo());
-
- $instance = $instance->withFoo1($a);
- $instance = $instance->withFoo2($a);
- $instance->setFoo($a);
-
- return $instance;
- }
-}
-
-class WitherProxyE94fdba extends \Symfony\Component\DependencyInjection\Tests\Compiler\Wither implements \Symfony\Component\VarExporter\LazyObjectInterface
-{
- use \Symfony\Component\VarExporter\LazyProxyTrait;
-
- private const LAZY_OBJECT_PROPERTY_SCOPES = [
- 'foo' => [parent::class, 'foo', null, 4],
- ];
-}
-
-// Help opcache.preload discover always-needed symbols
-class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
-class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);
diff --git a/src/Symfony/Component/DependencyInjection/Tests/LazyProxy/PhpDumper/LazyServiceDumperTest.php b/src/Symfony/Component/DependencyInjection/Tests/LazyProxy/PhpDumper/LazyServiceDumperTest.php
index 14d2f81b673ec..a0614c8c73a7f 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/LazyProxy/PhpDumper/LazyServiceDumperTest.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/LazyProxy/PhpDumper/LazyServiceDumperTest.php
@@ -54,16 +54,13 @@ public function testInvalidClass()
$dumper->getProxyCode($definition);
}
- /**
- * @requires PHP 8.3
- */
public function testReadonlyClass()
{
$dumper = new LazyServiceDumper();
$definition = (new Definition(ReadOnlyClass::class))->setLazy(true);
$this->assertTrue($dumper->isProxyCandidate($definition));
- $this->assertStringContainsString(\PHP_VERSION_ID >= 80400 ? '' : 'readonly class ReadOnlyClassGhost', $dumper->getProxyCode($definition));
+ $this->assertStringContainsString('', $dumper->getProxyCode($definition));
}
}
diff --git a/src/Symfony/Component/ErrorHandler/DebugClassLoader.php b/src/Symfony/Component/ErrorHandler/DebugClassLoader.php
index fa9029688873d..69930238195fe 100644
--- a/src/Symfony/Component/ErrorHandler/DebugClassLoader.php
+++ b/src/Symfony/Component/ErrorHandler/DebugClassLoader.php
@@ -868,7 +868,7 @@ private function setReturnType(string $types, string $class, string $method, str
$constant = new \ReflectionClassConstant($definingClass, $constantName);
- if (\PHP_VERSION_ID >= 80300 && $constantType = $constant->getType()) {
+ if ($constantType = $constant->getType()) {
if ($constantType instanceof \ReflectionNamedType) {
$n = $constantType->getName();
} else {
diff --git a/src/Symfony/Component/ErrorHandler/ErrorHandler.php b/src/Symfony/Component/ErrorHandler/ErrorHandler.php
index 5ffe75e5ef27a..b42075c88957b 100644
--- a/src/Symfony/Component/ErrorHandler/ErrorHandler.php
+++ b/src/Symfony/Component/ErrorHandler/ErrorHandler.php
@@ -180,11 +180,6 @@ public function __construct(
?BufferingLogger $bootstrappingLogger = null,
private bool $debug = false,
) {
- if (\PHP_VERSION_ID < 80400) {
- $this->levels[\E_STRICT] = 'Runtime Notice';
- $this->loggers[\E_STRICT] = [null, LogLevel::ERROR];
- }
-
if ($bootstrappingLogger) {
$this->bootstrappingLogger = $bootstrappingLogger;
$this->setDefaultLogger($bootstrappingLogger);
@@ -435,22 +430,6 @@ public function handleError(int $type, string $message, string $file, int $line)
return true;
}
} else {
- if (\PHP_VERSION_ID < 80303 && str_contains($message, '@anonymous')) {
- $backtrace = debug_backtrace(false, 5);
-
- for ($i = 1; isset($backtrace[$i]); ++$i) {
- if (isset($backtrace[$i]['function'], $backtrace[$i]['args'][0])
- && ('trigger_error' === $backtrace[$i]['function'] || 'user_error' === $backtrace[$i]['function'])
- ) {
- if ($backtrace[$i]['args'][0] !== $message) {
- $message = $backtrace[$i]['args'][0];
- }
-
- break;
- }
- }
- }
-
if (str_contains($message, "@anonymous\0")) {
$message = $this->parseAnonymousClass($message);
$logMessage = $this->levels[$type].': '.$message;
diff --git a/src/Symfony/Component/ErrorHandler/ErrorRenderer/HtmlErrorRenderer.php b/src/Symfony/Component/ErrorHandler/ErrorRenderer/HtmlErrorRenderer.php
index 7bd9a083e53a4..0d07a12a3ea9a 100644
--- a/src/Symfony/Component/ErrorHandler/ErrorRenderer/HtmlErrorRenderer.php
+++ b/src/Symfony/Component/ErrorHandler/ErrorRenderer/HtmlErrorRenderer.php
@@ -255,21 +255,13 @@ private function fileExcerpt(string $file, int $line, int $srcContext = 3): stri
// highlight_file could throw warnings
// see https://bugs.php.net/25725
$code = @highlight_file($file, true);
- if (\PHP_VERSION_ID >= 80300) {
- // remove main pre/code tags
- $code = preg_replace('#^\s*(.*)\s*#s', '\\1', $code);
- // split multiline span tags
- $code = preg_replace_callback('#]++)>((?:[^<\\n]*+\\n)++[^<]*+)#', function ($m) {
- return "".str_replace("\n", "\n", $m[2]).'';
- }, $code);
- $content = explode("\n", $code);
- } else {
- // remove main code/span tags
- $code = preg_replace('#^\s*(.*)\s*#s', '\\1', $code);
- // split multiline spans
- $code = preg_replace_callback('#]++)>((?:[^<]*+
)++[^<]*+)#', fn ($m) => "".str_replace('
', "
", $m[2]).'', $code);
- $content = explode('
', $code);
- }
+ // remove main pre/code tags
+ $code = preg_replace('#^\s*(.*)\s*#s', '\\1', $code);
+ // split multiline span tags
+ $code = preg_replace_callback('#]++)>((?:[^<\\n]*+\\n)++[^<]*+)#', function ($m) {
+ return "".str_replace("\n", "\n", $m[2]).'';
+ }, $code);
+ $content = explode("\n", $code);
$lines = [];
if (0 > $srcContext) {
diff --git a/src/Symfony/Component/ErrorHandler/Tests/DebugClassLoaderTest.php b/src/Symfony/Component/ErrorHandler/Tests/DebugClassLoaderTest.php
index 8575f892dbbe7..0ee60315d27a5 100644
--- a/src/Symfony/Component/ErrorHandler/Tests/DebugClassLoaderTest.php
+++ b/src/Symfony/Component/ErrorHandler/Tests/DebugClassLoaderTest.php
@@ -405,9 +405,6 @@ class_exists('Test\\'.ReturnType::class, true);
], $deprecations);
}
- /**
- * @requires PHP >= 8.3
- */
public function testReturnTypePhp83()
{
$deprecations = [];
diff --git a/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php b/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php
index 5f55cfb2c969d..350a8e865aa97 100644
--- a/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php
+++ b/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php
@@ -214,10 +214,6 @@ public function testDefaultLogger()
\E_CORE_ERROR => [null, LogLevel::CRITICAL],
];
- if (\PHP_VERSION_ID < 80400) {
- $loggers[\E_STRICT] = [null, LogLevel::ERROR];
- }
-
$this->assertSame($loggers, $handler->setLoggers([]));
} finally {
restore_error_handler();
@@ -455,10 +451,6 @@ public function testBootstrappingLogger()
\E_CORE_ERROR => [$bootLogger, LogLevel::CRITICAL],
];
- if (\PHP_VERSION_ID < 80400) {
- $loggers[\E_STRICT] = [$bootLogger, LogLevel::ERROR];
- }
-
$this->assertSame($loggers, $handler->setLoggers([]));
$handler->handleError(\E_DEPRECATED, 'Foo message', __FILE__, 123, []);
diff --git a/src/Symfony/Component/HttpClient/AmpHttpClient.php b/src/Symfony/Component/HttpClient/AmpHttpClient.php
index 4c73fbaf3db24..6bb41af6058d5 100644
--- a/src/Symfony/Component/HttpClient/AmpHttpClient.php
+++ b/src/Symfony/Component/HttpClient/AmpHttpClient.php
@@ -36,10 +36,6 @@
throw new \LogicException('You cannot use "Symfony\Component\HttpClient\AmpHttpClient" as the "amphp/http-client" package is not installed. Try running "composer require amphp/http-client:^4.2.1".');
}
-if (\PHP_VERSION_ID < 80400 && is_subclass_of(Request::class, HttpMessage::class)) {
- throw new \LogicException('Using "Symfony\Component\HttpClient\AmpHttpClient" with amphp/http-client >= 5 requires PHP >= 8.4. Try running "composer require amphp/http-client:^4.2.1" or upgrade to PHP >= 8.4.');
-}
-
/**
* A portable implementation of the HttpClientInterface contracts based on Amp's HTTP client.
*
diff --git a/src/Symfony/Component/HttpClient/HttpClient.php b/src/Symfony/Component/HttpClient/HttpClient.php
index 3eb3665614fd7..7bd70688643dd 100644
--- a/src/Symfony/Component/HttpClient/HttpClient.php
+++ b/src/Symfony/Component/HttpClient/HttpClient.php
@@ -31,7 +31,7 @@ final class HttpClient
*/
public static function create(array $defaultOptions = [], int $maxHostConnections = 6, int $maxPendingPushes = 50): HttpClientInterface
{
- if ($amp = class_exists(AmpRequest::class) && (\PHP_VERSION_ID >= 80400 || !is_subclass_of(AmpRequest::class, HttpMessage::class))) {
+ if ($amp = class_exists(AmpRequest::class)) {
if (!\extension_loaded('curl')) {
return new AmpHttpClient($defaultOptions, null, $maxHostConnections, $maxPendingPushes);
}
diff --git a/src/Symfony/Component/HttpClient/NativeHttpClient.php b/src/Symfony/Component/HttpClient/NativeHttpClient.php
index 941d37542c3ad..0022d584a6cb5 100644
--- a/src/Symfony/Component/HttpClient/NativeHttpClient.php
+++ b/src/Symfony/Component/HttpClient/NativeHttpClient.php
@@ -80,9 +80,6 @@ public function request(string $method, string $url, array $options = []): Respo
if (str_starts_with($options['bindto'], 'host!')) {
$options['bindto'] = substr($options['bindto'], 5);
}
- if ((\PHP_VERSION_ID < 80223 || 80300 <= \PHP_VERSION_ID && 80311 < \PHP_VERSION_ID) && '\\' === \DIRECTORY_SEPARATOR && '[' === $options['bindto'][0]) {
- $options['bindto'] = preg_replace('{^\[[^\]]++\]}', '[$0]', $options['bindto']);
- }
}
$hasContentLength = isset($options['normalized_headers']['content-length']);
@@ -429,11 +426,7 @@ private static function createRedirectResolver(array $options, string $authority
$redirectHeaders['no_auth'] = array_filter($redirectHeaders['no_auth'], $filterContentHeaders);
$redirectHeaders['with_auth'] = array_filter($redirectHeaders['with_auth'], $filterContentHeaders);
- if (\PHP_VERSION_ID >= 80300) {
- stream_context_set_options($context, ['http' => $options]);
- } else {
- stream_context_set_option($context, ['http' => $options]);
- }
+ stream_context_set_options($context, ['http' => $options]);
}
}
diff --git a/src/Symfony/Component/HttpKernel/DependencyInjection/ServicesResetter.php b/src/Symfony/Component/HttpKernel/DependencyInjection/ServicesResetter.php
index 57e394fcc5d69..2f7c35ee67754 100644
--- a/src/Symfony/Component/HttpKernel/DependencyInjection/ServicesResetter.php
+++ b/src/Symfony/Component/HttpKernel/DependencyInjection/ServicesResetter.php
@@ -45,7 +45,7 @@ public function reset(): void
continue;
}
- if (\PHP_VERSION_ID >= 80400 && (new \ReflectionClass($service))->isUninitializedLazyObject($service)) {
+ if (new \ReflectionClass($service)->isUninitializedLazyObject($service)) {
continue;
}
diff --git a/src/Symfony/Component/HttpKernel/Tests/DataCollector/RequestDataCollectorTest.php b/src/Symfony/Component/HttpKernel/Tests/DataCollector/RequestDataCollectorTest.php
index 93ba4c1fc3e38..2c4c972355f04 100644
--- a/src/Symfony/Component/HttpKernel/Tests/DataCollector/RequestDataCollectorTest.php
+++ b/src/Symfony/Component/HttpKernel/Tests/DataCollector/RequestDataCollectorTest.php
@@ -117,7 +117,7 @@ public static function provideControllerCallables(): array
'Closure',
fn () => 'foo',
[
- 'class' => \PHP_VERSION_ID >= 80400 ? \sprintf('{closure:%s():%d}', __METHOD__, __LINE__ - 2) : __NAMESPACE__.'\{closure}',
+ 'class' => \sprintf('{closure:%s():%d}', __METHOD__, __LINE__ - 2),
'method' => null,
'file' => __FILE__,
'line' => __LINE__ - 5,
diff --git a/src/Symfony/Component/JsonStreamer/DependencyInjection/StreamablePass.php b/src/Symfony/Component/JsonStreamer/DependencyInjection/StreamablePass.php
index babf962bfcdaa..590b667770485 100644
--- a/src/Symfony/Component/JsonStreamer/DependencyInjection/StreamablePass.php
+++ b/src/Symfony/Component/JsonStreamer/DependencyInjection/StreamablePass.php
@@ -47,10 +47,5 @@ public function process(ContainerBuilder $container): void
$container->getDefinition('.json_streamer.cache_warmer.streamer')
->replaceArgument(0, $streamable);
-
- if ($container->hasDefinition('.json_streamer.cache_warmer.lazy_ghost')) {
- $container->getDefinition('.json_streamer.cache_warmer.lazy_ghost')
- ->replaceArgument(0, array_keys($streamable));
- }
}
}
diff --git a/src/Symfony/Component/JsonStreamer/JsonStreamReader.php b/src/Symfony/Component/JsonStreamer/JsonStreamReader.php
index e813f4a8a5408..c66ccf08ac6d3 100644
--- a/src/Symfony/Component/JsonStreamer/JsonStreamReader.php
+++ b/src/Symfony/Component/JsonStreamer/JsonStreamReader.php
@@ -45,11 +45,10 @@ public function __construct(
private ContainerInterface $valueTransformers,
PropertyMetadataLoaderInterface $propertyMetadataLoader,
string $streamReadersDir,
- ?string $lazyGhostsDir = null,
) {
$this->streamReaderGenerator = new StreamReaderGenerator($propertyMetadataLoader, $streamReadersDir);
$this->instantiator = new Instantiator();
- $this->lazyInstantiator = new LazyInstantiator($lazyGhostsDir);
+ $this->lazyInstantiator = new LazyInstantiator();
}
public function read($input, Type $type, array $options = []): mixed
@@ -63,10 +62,9 @@ public function read($input, Type $type, array $options = []): mixed
/**
* @param array $valueTransformers
*/
- public static function create(array $valueTransformers = [], ?string $streamReadersDir = null, ?string $lazyGhostsDir = null): self
+ public static function create(array $valueTransformers = [], ?string $streamReadersDir = null): self
{
$streamReadersDir ??= sys_get_temp_dir().'/json_streamer/read';
- $lazyGhostsDir ??= sys_get_temp_dir().'/json_streamer/lazy_ghost';
$valueTransformers += [
'json_streamer.value_transformer.string_to_date_time' => new StringToDateTimeValueTransformer(),
];
@@ -101,6 +99,6 @@ public function get(string $id): ValueTransformerInterface
$typeContextFactory,
);
- return new self($valueTransformersContainer, $propertyMetadataLoader, $streamReadersDir, $lazyGhostsDir);
+ return new self($valueTransformersContainer, $propertyMetadataLoader, $streamReadersDir);
}
}
diff --git a/src/Symfony/Component/JsonStreamer/Read/LazyInstantiator.php b/src/Symfony/Component/JsonStreamer/Read/LazyInstantiator.php
index a9bd55553ad9d..6b0ddb3742923 100644
--- a/src/Symfony/Component/JsonStreamer/Read/LazyInstantiator.php
+++ b/src/Symfony/Component/JsonStreamer/Read/LazyInstantiator.php
@@ -11,15 +11,11 @@
namespace Symfony\Component\JsonStreamer\Read;
-use Symfony\Component\Filesystem\Filesystem;
-use Symfony\Component\JsonStreamer\Exception\InvalidArgumentException;
use Symfony\Component\JsonStreamer\Exception\RuntimeException;
-use Symfony\Component\VarExporter\ProxyHelper;
/**
- * Instantiates a new $className lazy ghost {@see \Symfony\Component\VarExporter\LazyGhostTrait}.
+ * Instantiates a new $className lazy ghost.
*
- * Prior to PHP 8.4, the "$className" argument class must not be final.
* The $initializer must be a callable that sets the actual object values when being called.
*
* @author Mathias Arlaud
@@ -28,8 +24,6 @@
*/
final class LazyInstantiator
{
- private ?Filesystem $fs = null;
-
/**
* @var array{reflection: array>, lazy_class_name: array}
*/
@@ -38,19 +32,6 @@ final class LazyInstantiator
'lazy_class_name' => [],
];
- /**
- * @var array
- */
- private static array $lazyClassesLoaded = [];
-
- public function __construct(
- private ?string $lazyGhostsDir = null,
- ) {
- if (null === $this->lazyGhostsDir && \PHP_VERSION_ID < 80400) {
- throw new InvalidArgumentException('The "$lazyGhostsDir" argument cannot be null when using PHP < 8.4.');
- }
- }
-
/**
* @template T of object
*
@@ -68,30 +49,6 @@ public function instantiate(string $className, callable $initializer): object
}
// use native lazy ghosts if available
- if (\PHP_VERSION_ID >= 80400) {
- return $classReflection->newLazyGhost($initializer);
- }
-
- $this->fs ??= new Filesystem();
-
- $lazyClassName = self::$cache['lazy_class_name'][$className] ??= \sprintf('%sGhost', preg_replace('/\\\\/', '', $className));
-
- if (isset(self::$lazyClassesLoaded[$className]) && class_exists($lazyClassName)) {
- return $lazyClassName::createLazyGhost($initializer);
- }
-
- if (!is_file($path = \sprintf('%s%s%s.php', $this->lazyGhostsDir, \DIRECTORY_SEPARATOR, hash('xxh128', $className)))) {
- if (!$this->fs->exists($this->lazyGhostsDir)) {
- $this->fs->mkdir($this->lazyGhostsDir);
- }
-
- $this->fs->dumpFile($path, \sprintf('newLazyGhost($initializer);
}
}
diff --git a/src/Symfony/Component/JsonStreamer/Tests/DependencyInjection/StreamablePassTest.php b/src/Symfony/Component/JsonStreamer/Tests/DependencyInjection/StreamablePassTest.php
index f58bc9ce81998..2e935a57514e6 100644
--- a/src/Symfony/Component/JsonStreamer/Tests/DependencyInjection/StreamablePassTest.php
+++ b/src/Symfony/Component/JsonStreamer/Tests/DependencyInjection/StreamablePassTest.php
@@ -23,7 +23,6 @@ public function testSetStreamable()
$container->register('json_streamer.stream_writer');
$container->register('.json_streamer.cache_warmer.streamer')->setArguments([null]);
- $container->register('.json_streamer.cache_warmer.lazy_ghost')->setArguments([null]);
$container->register('streamable')->setClass('Foo')->addTag('json_streamer.streamable', ['object' => true, 'list' => true]);
$container->register('abstractStreamable')->setClass('Bar')->addTag('json_streamer.streamable', ['object' => true, 'list' => true])->setAbstract(true);
@@ -33,9 +32,7 @@ public function testSetStreamable()
$pass->process($container);
$streamerCacheWarmer = $container->getDefinition('.json_streamer.cache_warmer.streamer');
- $lazyGhostCacheWarmer = $container->getDefinition('.json_streamer.cache_warmer.lazy_ghost');
$this->assertSame(['Foo' => ['object' => true, 'list' => true]], $streamerCacheWarmer->getArgument(0));
- $this->assertSame(['Foo'], $lazyGhostCacheWarmer->getArgument(0));
}
}
diff --git a/src/Symfony/Component/JsonStreamer/Tests/JsonStreamReaderTest.php b/src/Symfony/Component/JsonStreamer/Tests/JsonStreamReaderTest.php
index 6538a6d32383c..7b7f63da72deb 100644
--- a/src/Symfony/Component/JsonStreamer/Tests/JsonStreamReaderTest.php
+++ b/src/Symfony/Component/JsonStreamer/Tests/JsonStreamReaderTest.php
@@ -29,29 +29,22 @@
class JsonStreamReaderTest extends TestCase
{
private string $streamReadersDir;
- private string $lazyGhostsDir;
protected function setUp(): void
{
parent::setUp();
$this->streamReadersDir = \sprintf('%s/symfony_json_streamer_test/stream_reader', sys_get_temp_dir());
- $this->lazyGhostsDir = \sprintf('%s/symfony_json_streamer_test/lazy_ghost', sys_get_temp_dir());
if (is_dir($this->streamReadersDir)) {
array_map('unlink', glob($this->streamReadersDir.'/*'));
rmdir($this->streamReadersDir);
}
-
- if (is_dir($this->lazyGhostsDir)) {
- array_map('unlink', glob($this->lazyGhostsDir.'/*'));
- rmdir($this->lazyGhostsDir);
- }
}
public function testReadScalar()
{
- $reader = JsonStreamReader::create(streamReadersDir: $this->streamReadersDir, lazyGhostsDir: $this->lazyGhostsDir);
+ $reader = JsonStreamReader::create([], $this->streamReadersDir);
$this->assertRead($reader, null, 'null', Type::nullable(Type::int()));
$this->assertRead($reader, true, 'true', Type::bool());
@@ -63,7 +56,7 @@ public function testReadScalar()
public function testReadCollection()
{
- $reader = JsonStreamReader::create(streamReadersDir: $this->streamReadersDir, lazyGhostsDir: $this->lazyGhostsDir);
+ $reader = JsonStreamReader::create([], $this->streamReadersDir);
$this->assertRead(
$reader,
@@ -92,7 +85,7 @@ public function testReadCollection()
public function testReadObject()
{
- $reader = JsonStreamReader::create(streamReadersDir: $this->streamReadersDir, lazyGhostsDir: $this->lazyGhostsDir);
+ $reader = JsonStreamReader::create([], $this->streamReadersDir);
$this->assertRead($reader, function (mixed $read) {
$this->assertInstanceOf(ClassicDummy::class, $read);
@@ -103,7 +96,7 @@ public function testReadObject()
public function testReadObjectWithGenerics()
{
- $reader = JsonStreamReader::create(streamReadersDir: $this->streamReadersDir, lazyGhostsDir: $this->lazyGhostsDir);
+ $reader = JsonStreamReader::create([], $this->streamReadersDir);
$this->assertRead($reader, function (mixed $read) {
$this->assertInstanceOf(DummyWithGenerics::class, $read);
@@ -114,7 +107,7 @@ public function testReadObjectWithGenerics()
public function testReadObjectWithStreamedName()
{
- $reader = JsonStreamReader::create(streamReadersDir: $this->streamReadersDir, lazyGhostsDir: $this->lazyGhostsDir);
+ $reader = JsonStreamReader::create([], $this->streamReadersDir);
$this->assertRead($reader, function (mixed $read) {
$this->assertInstanceOf(DummyWithNameAttributes::class, $read);
@@ -125,12 +118,11 @@ public function testReadObjectWithStreamedName()
public function testReadObjectWithValueTransformer()
{
$reader = JsonStreamReader::create(
- valueTransformers: [
+ [
StringToBooleanValueTransformer::class => new StringToBooleanValueTransformer(),
DivideStringAndCastToIntValueTransformer::class => new DivideStringAndCastToIntValueTransformer(),
],
- streamReadersDir: $this->streamReadersDir,
- lazyGhostsDir: $this->lazyGhostsDir,
+ $this->streamReadersDir,
);
$this->assertRead($reader, function (mixed $read) {
@@ -144,7 +136,7 @@ public function testReadObjectWithValueTransformer()
public function testReadObjectWithPhpDoc()
{
- $reader = JsonStreamReader::create(streamReadersDir: $this->streamReadersDir, lazyGhostsDir: $this->lazyGhostsDir);
+ $reader = JsonStreamReader::create([], $this->streamReadersDir);
$this->assertRead($reader, function (mixed $read) {
$this->assertInstanceOf(DummyWithPhpDoc::class, $read);
@@ -156,7 +148,7 @@ public function testReadObjectWithPhpDoc()
public function testReadObjectWithNullableProperties()
{
- $reader = JsonStreamReader::create(streamReadersDir: $this->streamReadersDir, lazyGhostsDir: $this->lazyGhostsDir);
+ $reader = JsonStreamReader::create([], $this->streamReadersDir);
$this->assertRead($reader, function (mixed $read) {
$this->assertInstanceOf(DummyWithNullableProperties::class, $read);
@@ -167,7 +159,7 @@ public function testReadObjectWithNullableProperties()
public function testReadObjectWithDateTimes()
{
- $reader = JsonStreamReader::create(streamReadersDir: $this->streamReadersDir, lazyGhostsDir: $this->lazyGhostsDir);
+ $reader = JsonStreamReader::create([], $this->streamReadersDir);
$this->assertRead($reader, function (mixed $read) {
$this->assertInstanceOf(DummyWithDateTimes::class, $read);
@@ -178,7 +170,7 @@ public function testReadObjectWithDateTimes()
public function testCreateStreamReaderFile()
{
- $reader = JsonStreamReader::create(streamReadersDir: $this->streamReadersDir, lazyGhostsDir: $this->lazyGhostsDir);
+ $reader = JsonStreamReader::create([], $this->streamReadersDir);
$reader->read('true', Type::bool());
@@ -188,7 +180,7 @@ public function testCreateStreamReaderFile()
public function testCreateStreamReaderFileOnlyIfNotExists()
{
- $reader = JsonStreamReader::create(streamReadersDir: $this->streamReadersDir, lazyGhostsDir: $this->lazyGhostsDir);
+ $reader = JsonStreamReader::create([], $this->streamReadersDir);
if (!file_exists($this->streamReadersDir)) {
mkdir($this->streamReadersDir, recursive: true);
diff --git a/src/Symfony/Component/JsonStreamer/Tests/Read/LazyInstantiatorTest.php b/src/Symfony/Component/JsonStreamer/Tests/Read/LazyInstantiatorTest.php
index 90e5f498d9cd2..eb506cf332d4e 100644
--- a/src/Symfony/Component/JsonStreamer/Tests/Read/LazyInstantiatorTest.php
+++ b/src/Symfony/Component/JsonStreamer/Tests/Read/LazyInstantiatorTest.php
@@ -12,61 +12,11 @@
namespace Symfony\Component\JsonStreamer\Tests\Read;
use PHPUnit\Framework\TestCase;
-use Symfony\Component\JsonStreamer\Exception\InvalidArgumentException;
use Symfony\Component\JsonStreamer\Read\LazyInstantiator;
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\ClassicDummy;
class LazyInstantiatorTest extends TestCase
{
- private string $lazyGhostsDir;
-
- protected function setUp(): void
- {
- parent::setUp();
-
- $this->lazyGhostsDir = \sprintf('%s/symfony_json_streamer_test/lazy_ghost', sys_get_temp_dir());
-
- if (is_dir($this->lazyGhostsDir)) {
- array_map('unlink', glob($this->lazyGhostsDir.'/*'));
- rmdir($this->lazyGhostsDir);
- }
- }
-
- /**
- * @requires PHP < 8.4
- */
- public function testCreateLazyGhostUsingVarExporter()
- {
- $ghost = (new LazyInstantiator($this->lazyGhostsDir))->instantiate(ClassicDummy::class, function (ClassicDummy $object): void {
- $object->id = 123;
- });
-
- $this->assertSame(123, $ghost->id);
- }
-
- /**
- * @requires PHP < 8.4
- */
- public function testCreateCacheFile()
- {
- // use DummyForLazyInstantiation class to be sure that the instantiated object is not already in cache.
- (new LazyInstantiator($this->lazyGhostsDir))->instantiate(DummyForLazyInstantiation::class, function (DummyForLazyInstantiation $object): void {});
-
- $this->assertCount(1, glob($this->lazyGhostsDir.'/*'));
- }
-
- /**
- * @requires PHP < 8.4
- */
- public function testThrowIfLazyGhostDirNotDefined()
- {
- $this->expectException(InvalidArgumentException::class);
- new LazyInstantiator();
- }
-
- /**
- * @requires PHP 8.4
- */
public function testCreateLazyGhostUsingPhp()
{
$ghost = (new LazyInstantiator())->instantiate(ClassicDummy::class, function (ClassicDummy $object): void {
diff --git a/src/Symfony/Component/Ldap/Security/LdapUser.php b/src/Symfony/Component/Ldap/Security/LdapUser.php
index 020fcb5441596..c1a2ed30c7af5 100644
--- a/src/Symfony/Component/Ldap/Security/LdapUser.php
+++ b/src/Symfony/Component/Ldap/Security/LdapUser.php
@@ -66,10 +66,6 @@ public function getUserIdentifier(): string
#[\Deprecated(since: 'symfony/ldap 7.3')]
public function eraseCredentials(): void
{
- if (\PHP_VERSION_ID < 80400) {
- @trigger_error(\sprintf('Method %s::eraseCredentials() is deprecated since symfony/ldap 7.3', self::class), \E_USER_DEPRECATED);
- }
-
$this->password = null;
}
diff --git a/src/Symfony/Component/PasswordHasher/Tests/Hasher/NativePasswordHasherTest.php b/src/Symfony/Component/PasswordHasher/Tests/Hasher/NativePasswordHasherTest.php
index a21b6d6119b04..7ed4fbd80c638 100644
--- a/src/Symfony/Component/PasswordHasher/Tests/Hasher/NativePasswordHasherTest.php
+++ b/src/Symfony/Component/PasswordHasher/Tests/Hasher/NativePasswordHasherTest.php
@@ -99,39 +99,6 @@ public function testBcryptWithLongPassword()
$this->assertTrue($hasher->verify($hasher->hash($plainPassword), $plainPassword));
}
- /**
- * @requires PHP < 8.4
- */
- public function testBcryptWithNulByteWithNativePasswordHash()
- {
- $hasher = new NativePasswordHasher(null, null, 4, \PASSWORD_BCRYPT);
- $plainPassword = "a\0b";
-
- try {
- $hash = password_hash($plainPassword, \PASSWORD_BCRYPT, ['cost' => 4]);
- } catch (\Throwable $throwable) {
- // we skip the test in case the current PHP version does not support NUL bytes in passwords
- // with bcrypt
- //
- // @see https://github.com/php/php-src/commit/11f2568767660ffe92fbc6799800e01203aad73a
- if (str_contains($throwable->getMessage(), 'Bcrypt password must not contain null character')) {
- $this->markTestSkipped('password_hash() does not accept passwords containing NUL bytes.');
- }
-
- throw $throwable;
- }
-
- if (null === $hash) {
- // we also skip the test in case password_hash() returns null as
- // implemented in security patches backports
- //
- // @see https://github.com/shivammathur/php-src-backports/commit/d22d9ebb29dce86edd622205dd1196a2796c08c7
- $this->markTestSkipped('password_hash() does not accept passwords containing NUL bytes.');
- }
-
- $this->assertFalse($hasher->verify($hash, $plainPassword));
- }
-
public function testPasswordNulByteGracefullyHandled()
{
$hasher = new NativePasswordHasher(null, null, 4, \PASSWORD_BCRYPT);
diff --git a/src/Symfony/Component/PasswordHasher/Tests/Hasher/SodiumPasswordHasherTest.php b/src/Symfony/Component/PasswordHasher/Tests/Hasher/SodiumPasswordHasherTest.php
index 0a8b7ea88c0cc..aa52ce952c260 100644
--- a/src/Symfony/Component/PasswordHasher/Tests/Hasher/SodiumPasswordHasherTest.php
+++ b/src/Symfony/Component/PasswordHasher/Tests/Hasher/SodiumPasswordHasherTest.php
@@ -73,39 +73,6 @@ public function testBcryptWithLongPassword()
$this->assertTrue($hasher->verify((new NativePasswordHasher(null, null, 4, \PASSWORD_BCRYPT))->hash($plainPassword), $plainPassword));
}
- /**
- * @requires PHP < 8.4
- */
- public function testBcryptWithNulByteWithNativePasswordHash()
- {
- $hasher = new SodiumPasswordHasher(null, null);
- $plainPassword = "a\0b";
-
- try {
- $hash = password_hash($plainPassword, \PASSWORD_BCRYPT, ['cost' => 4]);
- } catch (\Throwable $throwable) {
- // we skip the test in case the current PHP version does not support NUL bytes in passwords
- // with bcrypt
- //
- // @see https://github.com/php/php-src/commit/11f2568767660ffe92fbc6799800e01203aad73a
- if (str_contains($throwable->getMessage(), 'Bcrypt password must not contain null character')) {
- $this->markTestSkipped('password_hash() does not accept passwords containing NUL bytes.');
- }
-
- throw $throwable;
- }
-
- if (null === $hash) {
- // we also skip the test in case password_hash() returns null as
- // implemented in security patches backports
- //
- // @see https://github.com/shivammathur/php-src-backports/commit/d22d9ebb29dce86edd622205dd1196a2796c08c7
- $this->markTestSkipped('password_hash() does not accept passwords containing NUL bytes.');
- }
-
- $this->assertFalse($hasher->verify($hash, $plainPassword));
- }
-
public function testPasswordNulByteGracefullyHandled()
{
$hasher = new SodiumPasswordHasher(null, null);
diff --git a/src/Symfony/Component/Process/Tests/ProcessTest.php b/src/Symfony/Component/Process/Tests/ProcessTest.php
index 17f98a664f4b9..ef63f7a618122 100644
--- a/src/Symfony/Component/Process/Tests/ProcessTest.php
+++ b/src/Symfony/Component/Process/Tests/ProcessTest.php
@@ -746,9 +746,6 @@ public function testProcessIsSignaledIfStopped()
if ('\\' === \DIRECTORY_SEPARATOR) {
$this->markTestSkipped('Windows does not support POSIX signals');
}
- if (\PHP_VERSION_ID < 80300 && isset($_SERVER['GITHUB_ACTIONS'])) {
- $this->markTestSkipped('Transient on GHA with PHP < 8.3');
- }
$process = $this->getProcessForCode('sleep(32);');
$process->start();
@@ -1700,9 +1697,6 @@ public function testNotIgnoringSignal()
if (!\function_exists('pcntl_signal')) {
$this->markTestSkipped('pnctl extension is required.');
}
- if (\PHP_VERSION_ID < 80300 && isset($_SERVER['GITHUB_ACTIONS'])) {
- $this->markTestSkipped('Transient on GHA with PHP < 8.3');
- }
$process = $this->getProcess(['sleep', '10']);
diff --git a/src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php b/src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php
index bb8043d5d45bd..d75e62766bf04 100644
--- a/src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php
+++ b/src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php
@@ -1032,29 +1032,9 @@ public function testIsReadableWithMissingPropertyAndLazyGhost()
private function createUninitializedObjectPropertyGhost(): UninitializedObjectProperty
{
- if (\PHP_VERSION_ID < 80400) {
- if (!class_exists(ProxyHelper::class)) {
- $this->markTestSkipped(\sprintf('Class "%s" is required to run this test.', ProxyHelper::class));
- }
-
- $class = 'UninitializedObjectPropertyGhost';
-
- if (!class_exists($class)) {
- eval('class '.$class.ProxyHelper::generateLazyGhost(new \ReflectionClass(UninitializedObjectProperty::class)));
- }
-
- $this->assertTrue(class_exists($class));
-
- return $class::createLazyGhost(initializer: function ($instance) {
- });
- }
-
- return (new \ReflectionClass(UninitializedObjectProperty::class))->newLazyGhost(fn () => null);
+ return new \ReflectionClass(UninitializedObjectProperty::class)->newLazyGhost(fn () => null);
}
- /**
- * @requires PHP 8.4
- */
public function testIsWritableWithAsymmetricVisibility()
{
$object = new AsymmetricVisibility();
@@ -1066,9 +1046,6 @@ public function testIsWritableWithAsymmetricVisibility()
$this->assertFalse($this->propertyAccessor->isWritable($object, 'virtualNoSetHook'));
}
- /**
- * @requires PHP 8.4
- */
public function testIsReadableWithAsymmetricVisibility()
{
$object = new AsymmetricVisibility();
@@ -1081,8 +1058,6 @@ public function testIsReadableWithAsymmetricVisibility()
}
/**
- * @requires PHP 8.4
- *
* @dataProvider setValueWithAsymmetricVisibilityDataProvider
*/
public function testSetValueWithAsymmetricVisibility(string $propertyPath, ?string $expectedException)
diff --git a/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php b/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php
index 39b16caeb86e3..78a37e257f470 100644
--- a/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php
+++ b/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php
@@ -723,15 +723,15 @@ private function isAllowedProperty(string $class, string $property, bool $writeA
return false;
}
- if (\PHP_VERSION_ID >= 80400 && $reflectionProperty->isProtectedSet()) {
+ if ($reflectionProperty->isProtectedSet()) {
return (bool) ($this->propertyReflectionFlags & \ReflectionProperty::IS_PROTECTED);
}
- if (\PHP_VERSION_ID >= 80400 && $reflectionProperty->isPrivateSet()) {
+ if ($reflectionProperty->isPrivateSet()) {
return (bool) ($this->propertyReflectionFlags & \ReflectionProperty::IS_PRIVATE);
}
- if (\PHP_VERSION_ID >= 80400 && $reflectionProperty->isVirtual() && !$reflectionProperty->hasHook(\PropertyHookType::Set)) {
+ if ($reflectionProperty->isVirtual() && !$reflectionProperty->hasHook(\PropertyHookType::Set)) {
return false;
}
}
@@ -974,18 +974,16 @@ private function getReadVisibilityForMethod(\ReflectionMethod $reflectionMethod)
private function getWriteVisibilityForProperty(\ReflectionProperty $reflectionProperty): string
{
- if (\PHP_VERSION_ID >= 80400) {
- if ($reflectionProperty->isVirtual() && !$reflectionProperty->hasHook(\PropertyHookType::Set)) {
- return PropertyWriteInfo::VISIBILITY_PRIVATE;
- }
+ if ($reflectionProperty->isVirtual() && !$reflectionProperty->hasHook(\PropertyHookType::Set)) {
+ return PropertyWriteInfo::VISIBILITY_PRIVATE;
+ }
- if ($reflectionProperty->isPrivateSet()) {
- return PropertyWriteInfo::VISIBILITY_PRIVATE;
- }
+ if ($reflectionProperty->isPrivateSet()) {
+ return PropertyWriteInfo::VISIBILITY_PRIVATE;
+ }
- if ($reflectionProperty->isProtectedSet()) {
- return PropertyWriteInfo::VISIBILITY_PROTECTED;
- }
+ if ($reflectionProperty->isProtectedSet()) {
+ return PropertyWriteInfo::VISIBILITY_PROTECTED;
}
if ($reflectionProperty->isPrivate()) {
diff --git a/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php b/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php
index fbf365ea5f2c4..330a35db87746 100644
--- a/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php
+++ b/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php
@@ -724,9 +724,6 @@ public static function provideLegacyExtractConstructorTypes(): array
];
}
- /**
- * @requires PHP 8.4
- */
public function testAsymmetricVisibility()
{
$this->assertTrue($this->extractor->isReadable(AsymmetricVisibility::class, 'publicPrivate'));
@@ -737,9 +734,6 @@ public function testAsymmetricVisibility()
$this->assertFalse($this->extractor->isWritable(AsymmetricVisibility::class, 'protectedPrivate'));
}
- /**
- * @requires PHP 8.4
- */
public function testAsymmetricVisibilityAllowPublicOnly()
{
$extractor = new ReflectionExtractor(null, null, null, true, ReflectionExtractor::ALLOW_PUBLIC);
@@ -752,9 +746,6 @@ public function testAsymmetricVisibilityAllowPublicOnly()
$this->assertFalse($extractor->isWritable(AsymmetricVisibility::class, 'protectedPrivate'));
}
- /**
- * @requires PHP 8.4
- */
public function testAsymmetricVisibilityAllowProtectedOnly()
{
$extractor = new ReflectionExtractor(null, null, null, true, ReflectionExtractor::ALLOW_PROTECTED);
@@ -767,9 +758,6 @@ public function testAsymmetricVisibilityAllowProtectedOnly()
$this->assertFalse($extractor->isWritable(AsymmetricVisibility::class, 'protectedPrivate'));
}
- /**
- * @requires PHP 8.4
- */
public function testAsymmetricVisibilityAllowPrivateOnly()
{
$extractor = new ReflectionExtractor(null, null, null, true, ReflectionExtractor::ALLOW_PRIVATE);
@@ -782,9 +770,6 @@ public function testAsymmetricVisibilityAllowPrivateOnly()
$this->assertTrue($extractor->isWritable(AsymmetricVisibility::class, 'protectedPrivate'));
}
- /**
- * @requires PHP 8.4
- */
public function testVirtualProperties()
{
$this->assertTrue($this->extractor->isReadable(VirtualProperties::class, 'virtualNoSetHook'));
@@ -797,8 +782,6 @@ public function testVirtualProperties()
/**
* @dataProvider provideAsymmetricVisibilityMutator
- *
- * @requires PHP 8.4
*/
public function testAsymmetricVisibilityMutator(string $property, string $readVisibility, string $writeVisibility)
{
@@ -823,8 +806,6 @@ public static function provideAsymmetricVisibilityMutator(): iterable
/**
* @dataProvider provideVirtualPropertiesMutator
- *
- * @requires PHP 8.4
*/
public function testVirtualPropertiesMutator(string $property, string $readVisibility, string $writeVisibility)
{
diff --git a/src/Symfony/Component/Security/Core/Authentication/Token/NullToken.php b/src/Symfony/Component/Security/Core/Authentication/Token/NullToken.php
index cb2bc0fd24225..9eee0909290f1 100644
--- a/src/Symfony/Component/Security/Core/Authentication/Token/NullToken.php
+++ b/src/Symfony/Component/Security/Core/Authentication/Token/NullToken.php
@@ -49,9 +49,6 @@ public function getUserIdentifier(): string
#[\Deprecated(since: 'symfony/security-core 7.3')]
public function eraseCredentials(): void
{
- if (\PHP_VERSION_ID < 80400) {
- @trigger_error(\sprintf('Method %s::eraseCredentials() is deprecated since symfony/security-core 7.3', self::class), \E_USER_DEPRECATED);
- }
}
public function getAttributes(): array
diff --git a/src/Symfony/Component/Security/Core/Tests/User/InMemoryUserTest.php b/src/Symfony/Component/Security/Core/Tests/User/InMemoryUserTest.php
index f06e98c32c80f..7cec7502464d7 100644
--- a/src/Symfony/Component/Security/Core/Tests/User/InMemoryUserTest.php
+++ b/src/Symfony/Component/Security/Core/Tests/User/InMemoryUserTest.php
@@ -62,7 +62,7 @@ public function testIsEnabled()
public function testEraseCredentials()
{
$user = new InMemoryUser('fabien', 'superpass');
- $this->expectUserDeprecationMessage(\sprintf('%sMethod %s::eraseCredentials() is deprecated since symfony/security-core 7.3', \PHP_VERSION_ID >= 80400 ? 'Unsilenced deprecation: ' : '', InMemoryUser::class));
+ $this->expectUserDeprecationMessage(\sprintf('Unsilenced deprecation: Method %s::eraseCredentials() is deprecated since symfony/security-core 7.3', InMemoryUser::class));
$user->eraseCredentials();
$this->assertEquals('superpass', $user->getPassword());
}
diff --git a/src/Symfony/Component/Security/Core/User/InMemoryUser.php b/src/Symfony/Component/Security/Core/User/InMemoryUser.php
index 7bed183a64d8e..9554350186939 100644
--- a/src/Symfony/Component/Security/Core/User/InMemoryUser.php
+++ b/src/Symfony/Component/Security/Core/User/InMemoryUser.php
@@ -80,9 +80,6 @@ public function isEnabled(): bool
#[\Deprecated(since: 'symfony/security-core 7.3')]
public function eraseCredentials(): void
{
- if (\PHP_VERSION_ID < 80400) {
- @trigger_error(\sprintf('Method %s::eraseCredentials() is deprecated since symfony/security-core 7.3', self::class), \E_USER_DEPRECATED);
- }
}
public function isEqualTo(UserInterface $user): bool
diff --git a/src/Symfony/Component/Security/Core/User/OidcUser.php b/src/Symfony/Component/Security/Core/User/OidcUser.php
index df59c5f7840d6..086928692a3f4 100644
--- a/src/Symfony/Component/Security/Core/User/OidcUser.php
+++ b/src/Symfony/Component/Security/Core/User/OidcUser.php
@@ -77,9 +77,6 @@ public function getUserIdentifier(): string
#[\Deprecated(since: 'symfony/security-core 7.3')]
public function eraseCredentials(): void
{
- if (\PHP_VERSION_ID < 80400) {
- @trigger_error(\sprintf('Method %s::eraseCredentials() is deprecated since symfony/security-core 7.3', self::class), \E_USER_DEPRECATED);
- }
}
public function getSub(): ?string
diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/NumberNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/NumberNormalizerTest.php
index 56d4776b2227d..04e6e5c8b6da9 100644
--- a/src/Symfony/Component/Serializer/Tests/Normalizer/NumberNormalizerTest.php
+++ b/src/Symfony/Component/Serializer/Tests/Normalizer/NumberNormalizerTest.php
@@ -52,7 +52,6 @@ public static function supportsNormalizationProvider(): iterable
}
/**
- * @requires PHP 8.4
* @requires extension bcmath
*
* @dataProvider normalizeGoodBcMathNumberValueProvider
@@ -108,7 +107,6 @@ public static function normalizeBadValueProvider(): iterable
}
/**
- * @requires PHP 8.4
* @requires extension bcmath
*/
public function testSupportsBcMathNumberDenormalization()
@@ -130,7 +128,6 @@ public function testDoesNotSupportOtherValuesDenormalization()
}
/**
- * @requires PHP 8.4
* @requires extension bcmath
*
* @dataProvider denormalizeGoodBcMathNumberValueProvider
@@ -168,7 +165,6 @@ public static function denormalizeGoodGmpValueProvider(): iterable
}
/**
- * @requires PHP 8.4
* @requires extension bcmath
*
* @dataProvider denormalizeBadBcMathNumberValueProvider
diff --git a/src/Symfony/Component/String/ByteString.php b/src/Symfony/Component/String/ByteString.php
index 5cbfd6de44bea..42c87b75951a1 100644
--- a/src/Symfony/Component/String/ByteString.php
+++ b/src/Symfony/Component/String/ByteString.php
@@ -56,38 +56,7 @@ public static function fromRandom(int $length = 16, ?string $alphabet = null): s
throw new InvalidArgumentException('The length of the alphabet must in the [2^1, 2^56] range.');
}
- if (\PHP_VERSION_ID >= 80300) {
- return new static((new Randomizer())->getBytesFromString($alphabet, $length));
- }
-
- $ret = '';
- while ($length > 0) {
- $urandomLength = (int) ceil(2 * $length * $bits / 8.0);
- $data = random_bytes($urandomLength);
- $unpackedData = 0;
- $unpackedBits = 0;
- for ($i = 0; $i < $urandomLength && $length > 0; ++$i) {
- // Unpack 8 bits
- $unpackedData = ($unpackedData << 8) | \ord($data[$i]);
- $unpackedBits += 8;
-
- // While we have enough bits to select a character from the alphabet, keep
- // consuming the random data
- for (; $unpackedBits >= $bits && $length > 0; $unpackedBits -= $bits) {
- $index = ($unpackedData & ((1 << $bits) - 1));
- $unpackedData >>= $bits;
- // Unfortunately, the alphabet size is not necessarily a power of two.
- // Worst case, it is 2^k + 1, which means we need (k+1) bits and we
- // have around a 50% chance of missing as k gets larger
- if ($index < $alphabetSize) {
- $ret .= $alphabet[$index];
- --$length;
- }
- }
- }
- }
-
- return new static($ret);
+ return new static((new Randomizer())->getBytesFromString($alphabet, $length));
}
public function bytesAt(int $offset): array
diff --git a/src/Symfony/Component/Validator/Constraints/NoSuspiciousCharactersValidator.php b/src/Symfony/Component/Validator/Constraints/NoSuspiciousCharactersValidator.php
index 0b7a78ef92e40..d82a62d57dd60 100644
--- a/src/Symfony/Component/Validator/Constraints/NoSuspiciousCharactersValidator.php
+++ b/src/Symfony/Component/Validator/Constraints/NoSuspiciousCharactersValidator.php
@@ -99,17 +99,7 @@ public function validate(mixed $value, Constraint $constraint): void
}
foreach (self::CHECK_ERROR as $check => $error) {
- if (\PHP_VERSION_ID < 80204) {
- if (!($checks & $check)) {
- continue;
- }
-
- $checker->setChecks($check);
-
- if (!$checker->isSuspicious($value)) {
- continue;
- }
- } elseif (!($errorCode & $check)) {
+ if (!($errorCode & $check)) {
continue;
}
diff --git a/src/Symfony/Component/VarDumper/Caster/Caster.php b/src/Symfony/Component/VarDumper/Caster/Caster.php
index c3bc54e3ac00b..ed088cedbc597 100644
--- a/src/Symfony/Component/VarDumper/Caster/Caster.php
+++ b/src/Symfony/Component/VarDumper/Caster/Caster.php
@@ -195,7 +195,7 @@ private static function getClassProperties(\ReflectionClass $class): array
$p->isPublic() => $p->name,
$p->isProtected() => self::PREFIX_PROTECTED.$p->name,
default => "\0".$className."\0".$p->name,
- }] = \PHP_VERSION_ID >= 80400 && $p->isVirtual() ? new VirtualStub($p) : new UninitializedStub($p);
+ }] = $p->isVirtual() ? new VirtualStub($p) : new UninitializedStub($p);
}
return $classProperties;
diff --git a/src/Symfony/Component/VarDumper/Caster/ReflectionCaster.php b/src/Symfony/Component/VarDumper/Caster/ReflectionCaster.php
index e7310f404ef4a..923a671e0d91b 100644
--- a/src/Symfony/Component/VarDumper/Caster/ReflectionCaster.php
+++ b/src/Symfony/Component/VarDumper/Caster/ReflectionCaster.php
@@ -119,14 +119,9 @@ public static function castType(\ReflectionType $c, array $a, Stub $stub, bool $
public static function castAttribute(\ReflectionAttribute $c, array $a, Stub $stub, bool $isNested): array
{
$map = [
- 'name' => 'getName',
'arguments' => 'getArguments',
];
- if (\PHP_VERSION_ID >= 80400) {
- unset($map['name']);
- }
-
self::addMap($a, $c, $map);
return $a;
diff --git a/src/Symfony/Component/VarDumper/Caster/ResourceCaster.php b/src/Symfony/Component/VarDumper/Caster/ResourceCaster.php
index 5613c5534cd5f..981f62ce13d90 100644
--- a/src/Symfony/Component/VarDumper/Caster/ResourceCaster.php
+++ b/src/Symfony/Component/VarDumper/Caster/ResourceCaster.php
@@ -34,12 +34,9 @@ public static function castCurl(\CurlHandle $h, array $a, Stub $stub, bool $isNe
return CurlCaster::castCurl($h, $a, $stub, $isNested);
}
- /**
- * @param resource|\Dba\Connection $dba
- */
- public static function castDba(mixed $dba, array $a, Stub $stub, bool $isNested): array
+ public static function castDba(\Dba\Connection $dba, array $a, Stub $stub, bool $isNested): array
{
- if (\PHP_VERSION_ID < 80402 && !\is_resource($dba)) {
+ if (\PHP_VERSION_ID < 80402) {
// @see https://github.com/php/php-src/issues/16990
return $a;
}
diff --git a/src/Symfony/Component/VarDumper/Caster/SocketCaster.php b/src/Symfony/Component/VarDumper/Caster/SocketCaster.php
index 6b95cd10ed0e1..e35ba5dc0f8e9 100644
--- a/src/Symfony/Component/VarDumper/Caster/SocketCaster.php
+++ b/src/Symfony/Component/VarDumper/Caster/SocketCaster.php
@@ -26,19 +26,17 @@ public static function castSocket(\Socket $socket, array $a, Stub $stub, bool $i
socket_getsockname($socket, $addr, $port);
$info = stream_get_meta_data(socket_export_stream($socket));
- if (\PHP_VERSION_ID >= 80300) {
- $uri = ($info['uri'] ?? '//');
- if (str_starts_with($uri, 'unix://')) {
- $uri .= $addr;
- } else {
- $uri .= \sprintf(str_contains($addr, ':') ? '[%s]:%s' : '%s:%s', $addr, $port);
- }
+ $uri = ($info['uri'] ?? '//');
+ if (str_starts_with($uri, 'unix://')) {
+ $uri .= $addr;
+ } else {
+ $uri .= \sprintf(str_contains($addr, ':') ? '[%s]:%s' : '%s:%s', $addr, $port);
+ }
- $a[Caster::PREFIX_VIRTUAL.'uri'] = $uri;
+ $a[Caster::PREFIX_VIRTUAL.'uri'] = $uri;
- if (@socket_atmark($socket)) {
- $a[Caster::PREFIX_VIRTUAL.'atmark'] = true;
- }
+ if (@socket_atmark($socket)) {
+ $a[Caster::PREFIX_VIRTUAL.'atmark'] = true;
}
$a += [
diff --git a/src/Symfony/Component/VarDumper/Cloner/AbstractCloner.php b/src/Symfony/Component/VarDumper/Cloner/AbstractCloner.php
index 9038d2c04e8a5..3befdf6c60a34 100644
--- a/src/Symfony/Component/VarDumper/Cloner/AbstractCloner.php
+++ b/src/Symfony/Component/VarDumper/Cloner/AbstractCloner.php
@@ -180,8 +180,6 @@ abstract class AbstractCloner implements ClonerInterface
'CurlHandle' => ['Symfony\Component\VarDumper\Caster\CurlCaster', 'castCurl'],
'Dba\Connection' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'],
- ':dba' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'],
- ':dba persistent' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'],
'GdImage' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castGd'],
diff --git a/src/Symfony/Component/VarDumper/Tests/Caster/DOMCasterTest.php b/src/Symfony/Component/VarDumper/Tests/Caster/DOMCasterTest.php
index 7b79939bfdd75..a9ad85ce1c1c2 100644
--- a/src/Symfony/Component/VarDumper/Tests/Caster/DOMCasterTest.php
+++ b/src/Symfony/Component/VarDumper/Tests/Caster/DOMCasterTest.php
@@ -32,9 +32,6 @@ public function testCastImplementation()
);
}
- /**
- * @requires PHP 8.4
- */
public function testCastModernImplementation()
{
$implementation = new \Dom\Implementation();
@@ -49,30 +46,6 @@ public function testCastModernImplementation()
);
}
- /**
- * @requires PHP < 8.4
- */
- public function testCastNodePriorToPhp84()
- {
- $doc = new \DOMDocument();
- $doc->loadXML('');
- $node = $doc->documentElement->firstChild;
-
- $this->assertDumpMatchesFormat(<<<'EODUMP'
- DOMElement {%A
- +ownerDocument: ? ?DOMDocument
- +namespaceURI: ? ?string
- +prefix: ? string
- +localName: ? ?string
- %A}
- EODUMP,
- $node
- );
- }
-
- /**
- * @requires PHP 8.4
- */
public function testCastNode()
{
$doc = new \DOMDocument();
@@ -91,9 +64,6 @@ public function testCastNode()
);
}
- /**
- * @requires PHP 8.4
- */
public function testCastModernNode()
{
$doc = \Dom\XMLDocument::createFromString('');
@@ -129,9 +99,6 @@ public function testCastDocument()
);
}
- /**
- * @requires PHP 8.4
- */
public function testCastXMLDocument()
{
$doc = \Dom\XMLDocument::createFromString('');
@@ -150,9 +117,6 @@ public function testCastXMLDocument()
);
}
- /**
- * @requires PHP 8.4
- */
public function testCastHTMLDocument()
{
$doc = \Dom\HTMLDocument::createFromString('foo
');
@@ -166,25 +130,6 @@ public function testCastHTMLDocument()
);
}
- /**
- * @requires PHP < 8.4
- */
- public function testCastTextPriorToPhp84()
- {
- $doc = new \DOMText('foo');
-
- $this->assertDumpMatchesFormat(<<<'EODUMP'
- DOMText {%A
- +wholeText: ? string
- }
- EODUMP,
- $doc
- );
- }
-
- /**
- * @requires PHP 8.4
- */
public function testCastText()
{
$doc = new \DOMText('foo');
@@ -198,9 +143,6 @@ public function testCastText()
);
}
- /**
- * @requires PHP 8.4
- */
public function testCastModernText()
{
$text = \Dom\HTMLDocument::createEmpty()->createTextNode('foo');
@@ -213,29 +155,6 @@ public function testCastModernText()
);
}
- /**
- * @requires PHP < 8.4
- */
- public function testCastAttrPriorToPhp84()
- {
- $attr = new \DOMAttr('attr', 'value');
-
- $this->assertDumpMatchesFormat(<<<'EODUMP'
- DOMAttr {%A
- +name: ? string
- +specified: true
- +value: ? string
- +ownerElement: ? ?DOMElement
- +schemaTypeInfo: null
- }
- EODUMP,
- $attr
- );
- }
-
- /**
- * @requires PHP 8.4
- */
public function testCastAttr()
{
$attr = new \DOMAttr('attr', 'value');
@@ -253,9 +172,6 @@ public function testCastAttr()
);
}
- /**
- * @requires PHP 8.4
- */
public function testCastAttrPrior()
{
$attr = new \DOMAttr('attr', 'value');
@@ -273,9 +189,6 @@ public function testCastAttrPrior()
);
}
- /**
- * @requires PHP 8.4
- */
public function testCastModernAttr()
{
$attr = \Dom\HTMLDocument::createEmpty()->createAttribute('attr');
@@ -292,25 +205,6 @@ public function testCastModernAttr()
);
}
- /**
- * @requires PHP < 8.4
- */
- public function testCastElementPriorToPhp84()
- {
- $attr = new \DOMElement('foo');
-
- $this->assertDumpMatchesFormat(<<<'EODUMP'
- DOMElement {%A
- +tagName: ? string
- %A}
- EODUMP,
- $attr
- );
- }
-
- /**
- * @requires PHP 8.4
- */
public function testCastElement()
{
$attr = new \DOMElement('foo');
@@ -324,9 +218,6 @@ public function testCastElement()
);
}
- /**
- * @requires PHP 8.4
- */
public function testCastModernElement()
{
$attr = \Dom\HTMLDocument::createEmpty()->createElement('foo');
@@ -340,31 +231,6 @@ public function testCastModernElement()
);
}
- /**
- * @requires PHP < 8.4
- */
- public function testCastDocumentTypePriorToPhp84()
- {
- $implementation = new \DOMImplementation();
- $type = $implementation->createDocumentType('html', 'publicId', 'systemId');
-
- $this->assertDumpMatchesFormat(<<<'EODUMP'
- DOMDocumentType {%A
- +name: ? string
- +entities: ? DOMNamedNodeMap
- +notations: ? DOMNamedNodeMap
- +publicId: ? string
- +systemId: ? string
- +internalSubset: ? ?string
- }
- EODUMP,
- $type
- );
- }
-
- /**
- * @requires PHP 8.4
- */
public function testCastDocumentType()
{
$implementation = new \DOMImplementation();
@@ -384,9 +250,6 @@ public function testCastDocumentType()
);
}
- /**
- * @requires PHP 8.4
- */
public function testCastModernDocumentType()
{
$implementation = new \Dom\Implementation();
@@ -406,26 +269,6 @@ public function testCastModernDocumentType()
);
}
- /**
- * @requires PHP < 8.4
- */
- public function testCastProcessingInstructionPriorToPhp84()
- {
- $entity = new \DOMProcessingInstruction('target', 'data');
-
- $this->assertDumpMatchesFormat(<<<'EODUMP'
- DOMProcessingInstruction {%A
- +target: ? string
- +data: ? string
- }
- EODUMP,
- $entity
- );
- }
-
- /**
- * @requires PHP 8.4
- */
public function testCastProcessingInstruction()
{
$entity = new \DOMProcessingInstruction('target', 'data');
@@ -440,9 +283,6 @@ public function testCastProcessingInstruction()
);
}
- /**
- * @requires PHP 8.4
- */
public function testCastModernProcessingInstruction()
{
$entity = \Dom\HTMLDocument::createEmpty()->createProcessingInstruction('target', 'data');
@@ -458,26 +298,6 @@ public function testCastModernProcessingInstruction()
);
}
- /**
- * @requires PHP < 8.4
- */
- public function testCastXPathPriorToPhp84()
- {
- $xpath = new \DOMXPath(new \DOMDocument());
-
- $this->assertDumpEquals(<<<'EODUMP'
- DOMXPath {
- +document: ? DOMDocument
- +registerNodeNamespaces: ? bool
- }
- EODUMP,
- $xpath
- );
- }
-
- /**
- * @requires PHP 8.4
- */
public function testCastXPath()
{
$xpath = new \DOMXPath(new \DOMDocument());
@@ -492,9 +312,6 @@ public function testCastXPath()
);
}
- /**
- * @requires PHP 8.4
- */
public function testCastModernXPath()
{
$entity = new \Dom\XPath(\Dom\HTMLDocument::createEmpty());
diff --git a/src/Symfony/Component/VarDumper/Tests/Caster/PdoCasterTest.php b/src/Symfony/Component/VarDumper/Tests/Caster/PdoCasterTest.php
index c6a96ec37069b..19ed360fb3060 100644
--- a/src/Symfony/Component/VarDumper/Tests/Caster/PdoCasterTest.php
+++ b/src/Symfony/Component/VarDumper/Tests/Caster/PdoCasterTest.php
@@ -43,8 +43,7 @@ public function testCastPdo()
$this->assertSame('NATURAL', $attr['CASE']->class);
$this->assertSame('BOTH', $attr['DEFAULT_FETCH_MODE']->class);
- if (\PHP_VERSION_ID >= 80215 && \PHP_VERSION_ID < 80300 || \PHP_VERSION_ID >= 80302) {
- $xDump = <<<'EODUMP'
+ $xDump = <<<'EODUMP'
array:2 [
"\x00~\x00inTransaction" => false
"\x00~\x00attributes" => array:10 [
@@ -63,26 +62,6 @@ public function testCastPdo()
]
]
EODUMP;
- } else {
- $xDump = <<<'EODUMP'
-array:2 [
- "\x00~\x00inTransaction" => false
- "\x00~\x00attributes" => array:9 [
- "CASE" => NATURAL
- "ERRMODE" => EXCEPTION
- "PERSISTENT" => false
- "DRIVER_NAME" => "sqlite"
- "ORACLE_NULLS" => NATURAL
- "CLIENT_VERSION" => "%s"
- "SERVER_VERSION" => "%s"
- "STATEMENT_CLASS" => array:%d [
- 0 => "PDOStatement"%A
- ]
- "DEFAULT_FETCH_MODE" => BOTH
- ]
-]
-EODUMP;
- }
$this->assertDumpMatchesFormat($xDump, $cast);
}
diff --git a/src/Symfony/Component/VarDumper/Tests/Caster/ReflectionCasterTest.php b/src/Symfony/Component/VarDumper/Tests/Caster/ReflectionCasterTest.php
index 83dad9e174ead..958d2b3a6836b 100644
--- a/src/Symfony/Component/VarDumper/Tests/Caster/ReflectionCasterTest.php
+++ b/src/Symfony/Component/VarDumper/Tests/Caster/ReflectionCasterTest.php
@@ -404,9 +404,6 @@ class: "Symfony\Component\VarDumper\Tests\Caster\ReflectionCasterTest"
);
}
- /**
- * @requires PHP 8.2
- */
public function testNullReturnType()
{
$className = Php82NullStandaloneReturnType::class;
@@ -460,84 +457,6 @@ class: "Symfony\Component\VarDumper\Tests\Caster\ReflectionCasterTest"
);
}
- /**
- * @requires PHP < 8.4
- */
- public function testGeneratorPriorTo84()
- {
- if (\extension_loaded('xdebug')) {
- $this->markTestSkipped('xdebug is active');
- }
-
- $generator = new GeneratorDemo();
- $generator = $generator->baz();
-
- $expectedDump = <<<'EODUMP'
-Generator {
- this: Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo { …}
- %s: {
- %sGeneratorDemo.php:14 {
- Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo->baz()
- › {
- › yield from bar();
- › }
- }
-%A}
- closed: false
-}
-EODUMP;
-
- $this->assertDumpMatchesFormat($expectedDump, $generator);
-
- foreach ($generator as $v) {
- break;
- }
-
- $expectedDump = <<<'EODUMP'
-array:2 [
- 0 => ReflectionGenerator {
- this: Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo { …}
- %s: {
- %s%eTests%eFixtures%eGeneratorDemo.php:%d {
- Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo::foo()
-%A › yield 1;
-%A }
- %s%eTests%eFixtures%eGeneratorDemo.php:20 { …}
- %s%eTests%eFixtures%eGeneratorDemo.php:14 { …}
-%A }
- closed: false
- }
- 1 => Generator {
- %s: {
- %s%eTests%eFixtures%eGeneratorDemo.php:%d {
- Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo::foo()
- › yield 1;
- › }
- ›
- }
-%A }
- closed: false
- }
-]
-EODUMP;
-
- $r = new \ReflectionGenerator($generator);
- $this->assertDumpMatchesFormat($expectedDump, [$r, $r->getExecutingGenerator()]);
-
- foreach ($generator as $v) {
- }
-
- $expectedDump = <<<'EODUMP'
-Generator {
- closed: true
-}
-EODUMP;
- $this->assertDumpMatchesFormat($expectedDump, $generator);
- }
-
- /**
- * @requires PHP 8.4
- */
public function testGenerator()
{
if (\extension_loaded('xdebug')) {
@@ -636,14 +555,13 @@ class: "Symfony\Component\VarDumper\Tests\Caster\ReflectionCasterTest"
public function testReflectionClassWithAttribute()
{
$var = new \ReflectionClass(LotsOfAttributes::class);
- $dumpedAttributeNameProperty = (\PHP_VERSION_ID < 80400 ? '' : '+').'name';
$this->assertDumpMatchesFormat(<< ReflectionAttribute {
- $dumpedAttributeNameProperty: "Symfony\Component\VarDumper\Tests\Fixtures\MyAttribute"
+ +name: "Symfony\Component\VarDumper\Tests\Fixtures\MyAttribute"
arguments: []
}
]
@@ -656,7 +574,6 @@ public function testReflectionClassWithAttribute()
public function testReflectionMethodWithAttribute()
{
$var = new \ReflectionMethod(LotsOfAttributes::class, 'someMethod');
- $dumpedAttributeNameProperty = (\PHP_VERSION_ID < 80400 ? '' : '+').'name';
$this->assertDumpMatchesFormat(<< ReflectionAttribute {
- $dumpedAttributeNameProperty: "Symfony\Component\VarDumper\Tests\Fixtures\MyAttribute"
+ +name: "Symfony\Component\VarDumper\Tests\Fixtures\MyAttribute"
arguments: array:1 [
0 => "two"
]
@@ -679,7 +596,6 @@ public function testReflectionMethodWithAttribute()
public function testReflectionPropertyWithAttribute()
{
$var = new \ReflectionProperty(LotsOfAttributes::class, 'someProperty');
- $dumpedAttributeNameProperty = (\PHP_VERSION_ID < 80400 ? '' : '+').'name';
$this->assertDumpMatchesFormat(<< ReflectionAttribute {
- $dumpedAttributeNameProperty: "Symfony\Component\VarDumper\Tests\Fixtures\MyAttribute"
+ +name: "Symfony\Component\VarDumper\Tests\Fixtures\MyAttribute"
arguments: array:2 [
0 => "one"
"extra" => "hello"
@@ -702,7 +618,6 @@ public function testReflectionPropertyWithAttribute()
public function testReflectionClassConstantWithAttribute()
{
$var = new \ReflectionClassConstant(LotsOfAttributes::class, 'SOME_CONSTANT');
- $dumpedAttributeNameProperty = (\PHP_VERSION_ID < 80400 ? '' : '+').'name';
$this->assertDumpMatchesFormat(<< ReflectionAttribute {
- $dumpedAttributeNameProperty: "Symfony\Component\VarDumper\Tests\Fixtures\RepeatableAttribute"
+ +name: "Symfony\Component\VarDumper\Tests\Fixtures\RepeatableAttribute"
arguments: array:1 [
0 => "one"
]
}
1 => ReflectionAttribute {
- $dumpedAttributeNameProperty: "Symfony\Component\VarDumper\Tests\Fixtures\RepeatableAttribute"
+ +name: "Symfony\Component\VarDumper\Tests\Fixtures\RepeatableAttribute"
arguments: array:1 [
0 => "two"
]
@@ -732,15 +647,14 @@ public function testReflectionClassConstantWithAttribute()
public function testReflectionParameterWithAttribute()
{
$var = new \ReflectionParameter([LotsOfAttributes::class, 'someMethod'], 'someParameter');
- $dumpedAttributeNameProperty = (\PHP_VERSION_ID < 80400 ? '' : '+').'name';
-
+
$this->assertDumpMatchesFormat(<< ReflectionAttribute {
- $dumpedAttributeNameProperty: "Symfony\Component\VarDumper\Tests\Fixtures\MyAttribute"
+ +name: "Symfony\Component\VarDumper\Tests\Fixtures\MyAttribute"
arguments: array:1 [
0 => "three"
]
diff --git a/src/Symfony/Component/VarDumper/Tests/Caster/ResourceCasterTest.php b/src/Symfony/Component/VarDumper/Tests/Caster/ResourceCasterTest.php
index 6fd3762b9102d..1bfd47f488e18 100644
--- a/src/Symfony/Component/VarDumper/Tests/Caster/ResourceCasterTest.php
+++ b/src/Symfony/Component/VarDumper/Tests/Caster/ResourceCasterTest.php
@@ -52,22 +52,6 @@ public function testCastGdIsDeprecated()
ResourceCaster::castGd($gd, [], new Stub(), false);
}
- /**
- * @requires PHP < 8.4
- * @requires extension dba
- */
- public function testCastDbaPriorToPhp84()
- {
- $dba = dba_open(sys_get_temp_dir().'/test.db', 'c');
-
- $this->assertDumpMatchesFormat(
- <<<'EODUMP'
-dba resource {
- file: %s
-}
-EODUMP, $dba);
- }
-
/**
* @requires extension dba
*/
diff --git a/src/Symfony/Component/VarDumper/Tests/Caster/SocketCasterTest.php b/src/Symfony/Component/VarDumper/Tests/Caster/SocketCasterTest.php
index 741a9ddd5f92e..82b8eb3bd0d10 100644
--- a/src/Symfony/Component/VarDumper/Tests/Caster/SocketCasterTest.php
+++ b/src/Symfony/Component/VarDumper/Tests/Caster/SocketCasterTest.php
@@ -21,9 +21,6 @@ class SocketCasterTest extends TestCase
{
use VarDumperTestTrait;
- /**
- * @requires PHP 8.3
- */
public function testCastSocket()
{
$socket = socket_create(\AF_INET, \SOCK_DGRAM, \SOL_UDP);
@@ -39,26 +36,6 @@ public function testCastSocket()
EODUMP, $socket);
}
- /**
- * @requires PHP < 8.3
- */
- public function testCastSocketPriorToPhp83()
- {
- $socket = socket_create(\AF_INET, \SOCK_DGRAM, \SOL_UDP);
- @socket_connect($socket, '127.0.0.1', 80);
-
- $this->assertDumpMatchesFormat(
- <<<'EODUMP'
-Socket {
- timed_out: false
- blocked: true
-}
-EODUMP, $socket);
- }
-
- /**
- * @requires PHP 8.3
- */
public function testCastSocketIpV6()
{
$socket = socket_create(\AF_INET6, \SOCK_STREAM, \SOL_TCP);
@@ -75,27 +52,6 @@ public function testCastSocketIpV6()
EODUMP, $socket);
}
- /**
- * @requires PHP < 8.3
- */
- public function testCastSocketIpV6PriorToPhp83()
- {
- $socket = socket_create(\AF_INET6, \SOCK_STREAM, \SOL_TCP);
- @socket_connect($socket, '::1', 80);
-
- $this->assertDumpMatchesFormat(
- <<<'EODUMP'
-Socket {
- timed_out: false
- blocked: true
- last_error: SOCKET_ECONNREFUSED
-}
-EODUMP, $socket);
- }
-
- /**
- * @requires PHP 8.3
- */
public function testCastUnixSocket()
{
$socket = socket_create(\AF_UNIX, \SOCK_STREAM, 0);
@@ -109,24 +65,6 @@ public function testCastUnixSocket()
blocked: true
last_error: SOCKET_ENOENT
}
-EODUMP, $socket);
- }
-
- /**
- * @requires PHP < 8.3
- */
- public function testCastUnixSocketPriorToPhp83()
- {
- $socket = socket_create(\AF_UNIX, \SOCK_STREAM, 0);
- @socket_connect($socket, '/tmp/socket.sock');
-
- $this->assertDumpMatchesFormat(
- <<<'EODUMP'
-Socket {
- timed_out: false
- blocked: true
- last_error: SOCKET_ENOENT
-}
EODUMP, $socket);
}
}
diff --git a/src/Symfony/Component/VarDumper/Tests/Caster/StubCasterTest.php b/src/Symfony/Component/VarDumper/Tests/Caster/StubCasterTest.php
index 1f76900d489e2..e5e369f0a262a 100644
--- a/src/Symfony/Component/VarDumper/Tests/Caster/StubCasterTest.php
+++ b/src/Symfony/Component/VarDumper/Tests/Caster/StubCasterTest.php
@@ -103,9 +103,6 @@ public function testEmptyStub()
$this->assertDumpMatchesFormat($expectedDump, $args);
}
- /**
- * @requires PHP 8.4
- */
public function testVirtualPropertyStub()
{
$class = new \ReflectionClass(VirtualProperty::class);
@@ -120,9 +117,6 @@ public function testVirtualPropertyStub()
$this->assertDumpMatchesFormat($expectedDump, $args);
}
- /**
- * @requires PHP 8.4
- */
public function testVirtualPropertyWithoutTypeStub()
{
$class = new \ReflectionClass(VirtualProperty::class);
@@ -253,7 +247,7 @@ public function testClassStubWithAnonymousClass()
$expectedDump = <<<'EODUMP'
array:1 [
- 0 => "Exception@anonymous"
+ 0 => "Exception@anonymous"
]
EODUMP;
diff --git a/src/Symfony/Component/VarDumper/Tests/Caster/XmlReaderCasterTest.php b/src/Symfony/Component/VarDumper/Tests/Caster/XmlReaderCasterTest.php
index 67feddba0f542..99790a4711a01 100644
--- a/src/Symfony/Component/VarDumper/Tests/Caster/XmlReaderCasterTest.php
+++ b/src/Symfony/Component/VarDumper/Tests/Caster/XmlReaderCasterTest.php
@@ -34,30 +34,6 @@ protected function tearDown(): void
$this->reader->close();
}
- /**
- * @requires PHP < 8.4
- */
- public function testParserPropertyPriorToPhp84()
- {
- $this->reader->setParserProperty(\XMLReader::SUBST_ENTITIES, true);
-
- $expectedDump = <<<'EODUMP'
-XMLReader {
- +nodeType: NONE
- parserProperties: {
- SUBST_ENTITIES: true
- …3
- }
- …12
-}
-EODUMP;
-
- $this->assertDumpMatchesFormat($expectedDump, $this->reader);
- }
-
- /**
- * @requires PHP 8.4
- */
public function testParserProperty()
{
$this->reader->setParserProperty(\XMLReader::SUBST_ENTITIES, true);
@@ -77,22 +53,6 @@ public function testParserProperty()
$this->assertDumpMatchesFormat($expectedDump, $this->reader);
}
- /**
- * This test only work before PHP 8.4. In PHP 8.4, XMLReader properties are virtual
- * and their values are not dumped.
- *
- * @requires PHP < 8.4
- *
- * @dataProvider provideNodes
- */
- public function testNodes($seek, $expectedDump)
- {
- while ($seek--) {
- $this->reader->read();
- }
- $this->assertDumpMatchesFormat($expectedDump, $this->reader);
- }
-
public static function provideNodes()
{
return [
@@ -275,26 +235,6 @@ public static function provideNodes()
];
}
- /**
- * @requires PHP < 8.4
- */
- public function testWithUninitializedXMLReaderPriorToPhp84()
- {
- $this->reader = new \XMLReader();
-
- $expectedDump = <<<'EODUMP'
-XMLReader {
- +nodeType: NONE
- …13
-}
-EODUMP;
-
- $this->assertDumpMatchesFormat($expectedDump, $this->reader);
- }
-
- /**
- * @requires PHP 8.4
- */
public function testWithUninitializedXMLReader()
{
$this->reader = new \XMLReader();
diff --git a/src/Symfony/Component/VarDumper/Tests/Dumper/CliDumperTest.php b/src/Symfony/Component/VarDumper/Tests/Dumper/CliDumperTest.php
index 14b538084b50c..a58d7a98aa564 100644
--- a/src/Symfony/Component/VarDumper/Tests/Dumper/CliDumperTest.php
+++ b/src/Symfony/Component/VarDumper/Tests/Dumper/CliDumperTest.php
@@ -305,9 +305,6 @@ public function testFlags()
putenv('DUMP_STRING_LENGTH=');
}
- /**
- * @requires PHP 8.4
- */
public function testVirtualProperties()
{
$this->assertDumpEquals(<< $v) {
$p = $reflector->hasProperty($n) ? $reflector->getProperty($n) : null;
- $c = $p && (\PHP_VERSION_ID >= 80400 ? $p->isProtectedSet() || $p->isPrivateSet() : $p->isReadOnly()) ? $p->class : 'stdClass';
+ $c = $p && ($p->isProtectedSet() || $p->isPrivateSet()) ? $p->class : 'stdClass';
$properties[$c][$n] = $v;
}
}
@@ -145,7 +145,7 @@ public static function prepare($values, $objectsPool, &$refsPool, &$objectsCount
$n = (string) $name;
if ('' === $n || "\0" !== $n[0]) {
$p = $reflector->hasProperty($n) ? $reflector->getProperty($n) : null;
- $c = $p && (\PHP_VERSION_ID >= 80400 ? $p->isProtectedSet() || $p->isPrivateSet() : $p->isReadOnly()) ? $p->class : 'stdClass';
+ $c = $p && ($p->isProtectedSet() || $p->isPrivateSet()) ? $p->class : 'stdClass';
} elseif ('*' === $n[1]) {
$n = substr($n, 3);
$c = $reflector->getProperty($n)->class;
diff --git a/src/Symfony/Component/VarExporter/Internal/Hydrator.php b/src/Symfony/Component/VarExporter/Internal/Hydrator.php
index 450935e5bdaa3..96c55eaff6e53 100644
--- a/src/Symfony/Component/VarExporter/Internal/Hydrator.php
+++ b/src/Symfony/Component/VarExporter/Internal/Hydrator.php
@@ -222,7 +222,7 @@ public static function getSimpleHydrator($class)
if ($propertyReflector->isStatic()) {
continue;
}
- if (\PHP_VERSION_ID >= 80400 && !$propertyReflector->isAbstract() && $propertyReflector->getHooks()) {
+ if (!$propertyReflector->isAbstract() && $propertyReflector->getHooks()) {
$notByRef->{$propertyReflector->name} = $propertyReflector->setRawValue(...);
} elseif ($propertyReflector->isReadOnly()) {
$notByRef->{$propertyReflector->name} = true;
@@ -273,7 +273,7 @@ public static function getPropertyScopes($class): array
$name = $property->name;
$access = ($flags << 2) | ($flags & \ReflectionProperty::IS_READONLY ? self::PROPERTY_NOT_BY_REF : 0);
- if (\PHP_VERSION_ID >= 80400 && !$property->isAbstract() && $h = $property->getHooks()) {
+ if (!$property->isAbstract() && $h = $property->getHooks()) {
$access |= self::PROPERTY_HAS_HOOKS | (isset($h['get']) && !$h['get']->returnsReference() ? self::PROPERTY_NOT_BY_REF : 0);
}
@@ -285,7 +285,7 @@ public static function getPropertyScopes($class): array
$propertyScopes[$name] = [$class, $name, null, $access, $property];
- if ($flags & (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PRIVATE_SET : \ReflectionProperty::IS_READONLY)) {
+ if ($flags & \ReflectionProperty::IS_PRIVATE_SET) {
$propertyScopes[$name][2] = $property->class;
}
@@ -306,7 +306,7 @@ public static function getPropertyScopes($class): array
$name = $property->name;
$access = ($flags << 2) | ($flags & \ReflectionProperty::IS_READONLY ? self::PROPERTY_NOT_BY_REF : 0);
- if (\PHP_VERSION_ID >= 80400 && $h = $property->getHooks()) {
+ if ($h = $property->getHooks()) {
$access |= self::PROPERTY_HAS_HOOKS | (isset($h['get']) && !$h['get']->returnsReference() ? self::PROPERTY_NOT_BY_REF : 0);
}
diff --git a/src/Symfony/Component/VarExporter/Internal/LazyObjectRegistry.php b/src/Symfony/Component/VarExporter/Internal/LazyObjectRegistry.php
index a2034258f0c8c..cb812cc092d7c 100644
--- a/src/Symfony/Component/VarExporter/Internal/LazyObjectRegistry.php
+++ b/src/Symfony/Component/VarExporter/Internal/LazyObjectRegistry.php
@@ -145,7 +145,7 @@ public static function getScopeForRead($propertyScopes, $class, $property)
public static function getScopeForWrite($propertyScopes, $class, $property, $flags)
{
- if (!($flags & (\ReflectionProperty::IS_PRIVATE | \ReflectionProperty::IS_PROTECTED | \ReflectionProperty::IS_READONLY | (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PRIVATE_SET | \ReflectionProperty::IS_PROTECTED_SET : 0)))) {
+ if (!($flags & (\ReflectionProperty::IS_PRIVATE | \ReflectionProperty::IS_PROTECTED | \ReflectionProperty::IS_READONLY | \ReflectionProperty::IS_PRIVATE_SET))) {
return null;
}
$frame = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2];
@@ -153,10 +153,10 @@ public static function getScopeForWrite($propertyScopes, $class, $property, $fla
if (\ReflectionProperty::class === $scope = $frame['class'] ?? \Closure::class) {
$scope = $frame['object']->class;
}
- if ($flags & (\ReflectionProperty::IS_PRIVATE | (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PRIVATE_SET : \ReflectionProperty::IS_READONLY))) {
+ if ($flags & (\ReflectionProperty::IS_PRIVATE | \ReflectionProperty::IS_PRIVATE_SET)) {
return $scope;
}
- if ($flags & (\ReflectionProperty::IS_PROTECTED | (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PROTECTED_SET : 0)) && ($class === $scope || (is_subclass_of($class, $scope) && !isset($propertyScopes["\0$scope\0$property"])))) {
+ if ($flags & (\ReflectionProperty::IS_PROTECTED | \ReflectionProperty::IS_PROTECTED_SET) && ($class === $scope || (is_subclass_of($class, $scope) && !isset($propertyScopes["\0$scope\0$property"])))) {
return null;
}
diff --git a/src/Symfony/Component/VarExporter/Internal/LazyObjectTrait.php b/src/Symfony/Component/VarExporter/Internal/LazyObjectTrait.php
index 4a6f232af85ab..bf1d989efc97f 100644
--- a/src/Symfony/Component/VarExporter/Internal/LazyObjectTrait.php
+++ b/src/Symfony/Component/VarExporter/Internal/LazyObjectTrait.php
@@ -12,23 +12,12 @@
namespace Symfony\Component\VarExporter\Internal;
use Symfony\Component\Serializer\Attribute\Ignore;
-
-if (\PHP_VERSION_ID >= 80300) {
- /**
- * @internal
- */
- trait LazyObjectTrait
- {
- #[Ignore]
- private readonly LazyObjectState $lazyObjectState;
- }
-} else {
- /**
- * @internal
- */
- trait LazyObjectTrait
- {
- #[Ignore]
- private LazyObjectState $lazyObjectState;
- }
+/**
+ * @internal
+ * @deprecated since Symfony 7.3
+ */
+trait LazyObjectTrait
+{
+ #[Ignore]
+ private readonly LazyObjectState $lazyObjectState;
}
diff --git a/src/Symfony/Component/VarExporter/LazyGhostTrait.php b/src/Symfony/Component/VarExporter/LazyGhostTrait.php
index 529ace2e9f555..86e3e3f49bc7a 100644
--- a/src/Symfony/Component/VarExporter/LazyGhostTrait.php
+++ b/src/Symfony/Component/VarExporter/LazyGhostTrait.php
@@ -17,9 +17,7 @@
use Symfony\Component\VarExporter\Internal\LazyObjectState;
use Symfony\Component\VarExporter\Internal\LazyObjectTrait;
-if (\PHP_VERSION_ID >= 80400) {
- trigger_deprecation('symfony/var-exporter', '7.3', 'The "%s" trait is deprecated, use native lazy objects instead.', LazyGhostTrait::class);
-}
+trigger_deprecation('symfony/var-exporter', '7.3', 'The "%s" trait is deprecated, use native lazy objects instead.', LazyGhostTrait::class);
/**
* @deprecated since Symfony 7.3, use native lazy objects instead
@@ -146,7 +144,7 @@ public function &__get($name): mixed
} else {
$property = null;
}
- if (\PHP_VERSION_ID >= 80400 && !$notByRef && ($access >> 2) & \ReflectionProperty::IS_PRIVATE_SET) {
+ if (!$notByRef && ($access >> 2) & \ReflectionProperty::IS_PRIVATE_SET) {
$scope ??= $writeScope;
}
diff --git a/src/Symfony/Component/VarExporter/LazyProxyTrait.php b/src/Symfony/Component/VarExporter/LazyProxyTrait.php
index fc28c1d2a5e08..5aacde7b1c18b 100644
--- a/src/Symfony/Component/VarExporter/LazyProxyTrait.php
+++ b/src/Symfony/Component/VarExporter/LazyProxyTrait.php
@@ -18,9 +18,7 @@
use Symfony\Component\VarExporter\Internal\LazyObjectState;
use Symfony\Component\VarExporter\Internal\LazyObjectTrait;
-if (\PHP_VERSION_ID >= 80400) {
- trigger_deprecation('symfony/var-exporter', '7.3', 'The "%s" trait is deprecated, use native lazy objects instead.', LazyProxyTrait::class);
-}
+trigger_deprecation('symfony/var-exporter', '7.3', 'The "%s" trait is deprecated, use native lazy objects instead.', LazyProxyTrait::class);
/**
* @deprecated since Symfony 7.3, use native lazy objects instead
@@ -123,7 +121,7 @@ public function &__get($name): mixed
if ($state = $this->lazyObjectState ?? null) {
$instance = $state->realInstance ??= ($state->initializer)();
}
- if (\PHP_VERSION_ID >= 80400 && !$notByRef && ($access >> 2) & \ReflectionProperty::IS_PRIVATE_SET) {
+ if (!$notByRef && ($access >> 2) & \ReflectionProperty::IS_PRIVATE_SET) {
$scope ??= $writeScope;
}
$parent = 2;
diff --git a/src/Symfony/Component/VarExporter/ProxyHelper.php b/src/Symfony/Component/VarExporter/ProxyHelper.php
index b815e7040c501..a52aba295cb0d 100644
--- a/src/Symfony/Component/VarExporter/ProxyHelper.php
+++ b/src/Symfony/Component/VarExporter/ProxyHelper.php
@@ -30,12 +30,6 @@ final class ProxyHelper
*/
public static function generateLazyGhost(\ReflectionClass $class): string
{
- if (\PHP_VERSION_ID >= 80400) {
- trigger_deprecation('symfony/var-exporter', '7.3', 'Using ProxyHelper::generateLazyGhost() is deprecated, use native lazy objects instead.');
- }
- if (\PHP_VERSION_ID < 80300 && $class->isReadOnly()) {
- throw new LogicException(\sprintf('Cannot generate lazy ghost with PHP < 8.3: class "%s" is readonly.', $class->name));
- }
if ($class->isFinal()) {
throw new LogicException(\sprintf('Cannot generate lazy ghost: class "%s" is final.', $class->name));
}
@@ -138,9 +132,6 @@ public static function generateLazyProxy(?\ReflectionClass $class, array $interf
if ($class?->isFinal()) {
throw new LogicException(\sprintf('Cannot generate lazy proxy: class "%s" is final.', $class->name));
}
- if (\PHP_VERSION_ID < 80400) {
- return self::generateLegacyLazyProxy($class, $interfaces);
- }
if ($class && !$class->isAbstract()) {
$parent = $class;
@@ -376,156 +367,6 @@ class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
EOPHP;
}
- private static function generateLegacyLazyProxy(?\ReflectionClass $class, array $interfaces): string
- {
- if (\PHP_VERSION_ID < 80300 && $class?->isReadOnly()) {
- throw new LogicException(\sprintf('Cannot generate lazy proxy with PHP < 8.3: class "%s" is readonly.', $class->name));
- }
-
- $propertyScopes = $class ? Hydrator::$propertyScopes[$class->name] ??= Hydrator::getPropertyScopes($class->name) : [];
- $methodReflectors = [$class?->getMethods(\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED) ?? []];
- foreach ($interfaces as $interface) {
- if (!$interface->isInterface()) {
- throw new LogicException(\sprintf('Cannot generate lazy proxy: "%s" is not an interface.', $interface->name));
- }
- $methodReflectors[] = $interface->getMethods();
- }
-
- $extendsInternalClass = false;
- if ($parent = $class) {
- do {
- $extendsInternalClass = \stdClass::class !== $parent->name && $parent->isInternal();
- } while (!$extendsInternalClass && $parent = $parent->getParentClass());
- }
- $methodsHaveToBeProxied = $extendsInternalClass;
- $methods = [];
- $methodReflectors = array_merge(...$methodReflectors);
-
- foreach ($methodReflectors as $method) {
- if ('__get' !== strtolower($method->name) || 'mixed' === ($type = self::exportType($method) ?? 'mixed')) {
- continue;
- }
- $methodsHaveToBeProxied = true;
- $trait = new \ReflectionMethod(LazyProxyTrait::class, '__get');
- $body = \array_slice(file($trait->getFileName()), $trait->getStartLine() - 1, $trait->getEndLine() - $trait->getStartLine());
- $body[0] = str_replace('): mixed', '): '.$type, $body[0]);
- $methods['__get'] = strtr(implode('', $body).' }', [
- 'Hydrator' => '\\'.Hydrator::class,
- 'Registry' => '\\'.LazyObjectRegistry::class,
- ]);
- break;
- }
-
- foreach ($methodReflectors as $method) {
- if (($method->isStatic() && !$method->isAbstract()) || isset($methods[$lcName = strtolower($method->name)])) {
- continue;
- }
- if ($method->isFinal()) {
- if ($extendsInternalClass || $methodsHaveToBeProxied || method_exists(LazyProxyTrait::class, $method->name)) {
- throw new LogicException(\sprintf('Cannot generate lazy proxy: method "%s::%s()" is final.', $class->name, $method->name));
- }
- continue;
- }
- if (method_exists(LazyProxyTrait::class, $method->name) || ($method->isProtected() && !$method->isAbstract())) {
- continue;
- }
-
- $signature = self::exportSignature($method, true, $args);
- $parentCall = $method->isAbstract() ? "throw new \BadMethodCallException('Cannot forward abstract method \"{$method->class}::{$method->name}()\".')" : "parent::{$method->name}({$args})";
-
- if ($method->isStatic()) {
- $body = " $parentCall;";
- } elseif (str_ends_with($signature, '): never') || str_ends_with($signature, '): void')) {
- $body = <<lazyObjectState)) {
- (\$this->lazyObjectState->realInstance ??= (\$this->lazyObjectState->initializer)())->{$method->name}({$args});
- } else {
- {$parentCall};
- }
- EOPHP;
- } else {
- if (!$methodsHaveToBeProxied && !$method->isAbstract()) {
- // Skip proxying methods that might return $this
- foreach (preg_split('/[()|&]++/', self::exportType($method) ?? 'static') as $type) {
- if (\in_array($type = ltrim($type, '?'), ['static', 'object'], true)) {
- continue 2;
- }
- foreach ([$class, ...$interfaces] as $r) {
- if ($r && is_a($r->name, $type, true)) {
- continue 3;
- }
- }
- }
- }
-
- $body = <<lazyObjectState)) {
- return (\$this->lazyObjectState->realInstance ??= (\$this->lazyObjectState->initializer)())->{$method->name}({$args});
- }
-
- return {$parentCall};
- EOPHP;
- }
- $methods[$lcName] = " {$signature}\n {\n{$body}\n }";
- }
-
- $types = $interfaces = array_unique(array_column($interfaces, 'name'));
- $interfaces[] = LazyObjectInterface::class;
- $interfaces = implode(', \\', $interfaces);
- $parent = $class ? ' extends \\'.$class->name : '';
- array_unshift($types, $class ? 'parent' : '');
- $type = ltrim(implode('&\\', $types), '&');
-
- if (!$class) {
- $trait = new \ReflectionMethod(LazyProxyTrait::class, 'initializeLazyObject');
- $body = \array_slice(file($trait->getFileName()), $trait->getStartLine() - 1, $trait->getEndLine() - $trait->getStartLine());
- $body[0] = str_replace('): parent', '): '.$type, $body[0]);
- $methods = ['initializeLazyObject' => implode('', $body).' }'] + $methods;
- }
- $body = $methods ? "\n".implode("\n\n", $methods)."\n" : '';
- $propertyScopes = $class ? self::exportPropertyScopes($class->name, $propertyScopes) : '[]';
-
- if (
- $class?->hasMethod('__unserialize')
- && !$class->getMethod('__unserialize')->getParameters()[0]->getType()
- ) {
- // fix contravariance type problem when $class declares a `__unserialize()` method without typehint.
- $lazyProxyTraitStatement = <<__doUnserialize(\$data);
- }
-
- EOPHP;
- } else {
- $lazyProxyTraitStatement = <<assertSame(\PHP_VERSION_ID >= 80400 ? 1 : 0, $initCounter);
+ $this->assertSame(1, $initCounter);
$dep1 = $proxy->getDep();
- $this->assertSame(\PHP_VERSION_ID >= 80400 ? 1 : 1, $initCounter);
+ $this->assertSame(1, $initCounter);
$dep2 = $clone->getDep();
- $this->assertSame(\PHP_VERSION_ID >= 80400 ? 1 : 2, $initCounter);
+ $this->assertSame(1, $initCounter);
- $this->assertSame(\PHP_VERSION_ID >= 80400, $dep1 === $dep2);
+ $this->assertSame($dep1, $dep2);
}
public function testUnserialize()
@@ -223,7 +220,7 @@ public function withFoo($foo): static
$clone = $proxy->withFoo(234);
$this->assertSame($clone::class, $proxy::class);
$this->assertSame(234, $clone->foo);
- $this->assertSame(\PHP_VERSION_ID >= 80400 ? 123 : 234, $obj->foo);
+ $this->assertSame(123, $obj->foo);
}
public function testFluent()
@@ -258,11 +255,6 @@ public function testIndirectModification()
public function testReadOnlyClass()
{
- if (\PHP_VERSION_ID < 80300) {
- $this->expectException(LogicException::class);
- $this->expectExceptionMessage('Cannot generate lazy proxy with PHP < 8.3: class "Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\ReadOnlyClass" is readonly.');
- }
-
$proxy = $this->createLazyProxy(ReadOnlyClass::class, fn () => new ConcreteReadOnlyClass(123));
$this->assertSame(123, $proxy->foo);
@@ -292,9 +284,6 @@ public function testReinitRegularLazyProxy()
$this->assertSame(234, $object->foo);
}
- /**
- * @requires PHP 8.3
- */
public function testReinitReadonlyLazyProxy()
{
$object = $this->createLazyProxy(ReadOnlyClass::class, fn () => new ConcreteReadOnlyClass(123));
@@ -306,9 +295,6 @@ public function testReinitReadonlyLazyProxy()
$this->assertSame(234, $object->foo);
}
- /**
- * @requires PHP 8.4
- */
public function testConcretePropertyHooks()
{
$initialized = false;
@@ -335,9 +321,6 @@ public function testConcretePropertyHooks()
$this->assertSame(345, $object->backed);
}
- /**
- * @requires PHP 8.4
- */
public function testAbstractPropertyHooks()
{
$initialized = false;
@@ -369,9 +352,6 @@ public function testAbstractPropertyHooks()
$this->assertTrue($initialized);
}
- /**
- * @requires PHP 8.4
- */
public function testAsymmetricVisibility()
{
$object = $this->createLazyProxy(AsymmetricVisibility::class, function () {
diff --git a/src/Symfony/Component/VarExporter/Tests/LegacyLazyGhostTraitTest.php b/src/Symfony/Component/VarExporter/Tests/LegacyLazyGhostTraitTest.php
index c650626847055..1683a3c799834 100644
--- a/src/Symfony/Component/VarExporter/Tests/LegacyLazyGhostTraitTest.php
+++ b/src/Symfony/Component/VarExporter/Tests/LegacyLazyGhostTraitTest.php
@@ -241,9 +241,6 @@ public function testIndirectModification()
$this->assertSame([123], $proxy->foo);
}
- /**
- * @requires PHP 8.3
- */
public function testReadOnlyClass()
{
$proxy = $this->createLazyGhost(ReadOnlyClass::class, fn ($proxy) => $proxy->__construct(123));
@@ -297,9 +294,6 @@ public function testReinitLazyGhost()
$this->assertSame(3, $object->public);
}
- /**
- * @requires PHP 8.4
- */
public function testPropertyHooks()
{
$initialized = false;
@@ -322,9 +316,6 @@ public function testPropertyHooks()
$this->assertSame(345, $object->backed);
}
- /**
- * @requires PHP 8.4
- */
public function testPropertyHooksWithDefaultValue()
{
$initialized = false;
@@ -350,9 +341,6 @@ public function testPropertyHooksWithDefaultValue()
$this->assertSame(true, $object->backedBoolWithDefault);
}
- /**
- * @requires PHP 8.4
- */
public function testAsymmetricVisibility()
{
$object = $this->createLazyGhost(AsymmetricVisibility::class, function ($instance) {
diff --git a/src/Symfony/Component/VarExporter/Tests/LegacyLazyProxyTraitTest.php b/src/Symfony/Component/VarExporter/Tests/LegacyLazyProxyTraitTest.php
deleted file mode 100644
index 383b08fe82e22..0000000000000
--- a/src/Symfony/Component/VarExporter/Tests/LegacyLazyProxyTraitTest.php
+++ /dev/null
@@ -1,58 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\VarExporter\Tests;
-
-use Symfony\Component\VarExporter\LazyProxyTrait;
-use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\FinalPublicClass;
-use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\TestClass;
-use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\TestOverwritePropClass;
-
-/**
- * @requires PHP < 8.4
- *
- * @group legacy
- */
-class LegacyLazyProxyTraitTest extends LazyProxyTraitTest
-{
- public function testLazyDecoratorClass()
- {
- $obj = new class extends TestClass {
- use LazyProxyTrait {
- createLazyProxy as private;
- }
-
- public function __construct()
- {
- self::createLazyProxy(fn () => new TestClass((object) ['foo' => 123]), $this);
- }
- };
-
- $this->assertSame(['foo' => 123], (array) $obj->getDep());
- }
-
- public function testFinalPublicClass()
- {
- $proxy = $this->createLazyProxy(FinalPublicClass::class, fn () => new FinalPublicClass());
-
- $this->assertSame(1, $proxy->increment());
- $this->assertSame(2, $proxy->increment());
- $this->assertSame(1, $proxy->decrement());
- }
-
- public function testOverwritePropClass()
- {
- $proxy = $this->createLazyProxy(TestOverwritePropClass::class, fn () => new TestOverwritePropClass('123', 5));
-
- $this->assertSame('123', $proxy->getDep());
- $this->assertSame(1, $proxy->increment());
- }
-}
diff --git a/src/Symfony/Component/VarExporter/Tests/LegacyProxyHelperTest.php b/src/Symfony/Component/VarExporter/Tests/LegacyProxyHelperTest.php
deleted file mode 100644
index 71c46c448ac1d..0000000000000
--- a/src/Symfony/Component/VarExporter/Tests/LegacyProxyHelperTest.php
+++ /dev/null
@@ -1,200 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\VarExporter\Tests;
-
-use Symfony\Component\VarExporter\Exception\LogicException;
-use Symfony\Component\VarExporter\ProxyHelper;
-use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\Php82NullStandaloneReturnType;
-use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\StringMagicGetClass;
-
-/**
- * @requires PHP < 8.4
- *
- * @group legacy
- */
-class LegacyProxyHelperTest extends ProxyHelperTest
-{
- public function testGenerateLazyProxy()
- {
- $expected = <<<'EOPHP'
- extends \Symfony\Component\VarExporter\Tests\TestForProxyHelper implements \Symfony\Component\VarExporter\LazyObjectInterface
- {
- use \Symfony\Component\VarExporter\LazyProxyTrait;
-
- private const LAZY_OBJECT_PROPERTY_SCOPES = [];
-
- public function foo1(): ?\Symfony\Component\VarExporter\Tests\Bar
- {
- if (isset($this->lazyObjectState)) {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->foo1(...\func_get_args());
- }
-
- return parent::foo1(...\func_get_args());
- }
-
- public function foo4(\Symfony\Component\VarExporter\Tests\Bar|string $b, &$d): void
- {
- if (isset($this->lazyObjectState)) {
- ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->foo4($b, $d, ...\array_slice(\func_get_args(), 2));
- } else {
- parent::foo4($b, $d, ...\array_slice(\func_get_args(), 2));
- }
- }
-
- protected function foo7()
- {
- if (isset($this->lazyObjectState)) {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->foo7(...\func_get_args());
- }
-
- return throw new \BadMethodCallException('Cannot forward abstract method "Symfony\Component\VarExporter\Tests\TestForProxyHelper::foo7()".');
- }
- }
-
- // Help opcache.preload discover always-needed symbols
- class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
- class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
- class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);
-
- EOPHP;
-
- $this->assertSame($expected, ProxyHelper::generateLazyProxy(new \ReflectionClass(TestForProxyHelper::class)));
- }
-
- public function testGenerateLazyProxyForInterfaces()
- {
- $expected = <<<'EOPHP'
- implements \Symfony\Component\VarExporter\Tests\TestForProxyHelperInterface1, \Symfony\Component\VarExporter\Tests\TestForProxyHelperInterface2, \Symfony\Component\VarExporter\LazyObjectInterface
- {
- use \Symfony\Component\VarExporter\LazyProxyTrait;
-
- private const LAZY_OBJECT_PROPERTY_SCOPES = [];
-
- public function initializeLazyObject(): \Symfony\Component\VarExporter\Tests\TestForProxyHelperInterface1&\Symfony\Component\VarExporter\Tests\TestForProxyHelperInterface2
- {
- if ($state = $this->lazyObjectState ?? null) {
- return $state->realInstance ??= ($state->initializer)();
- }
-
- return $this;
- }
-
- public function foo1(): ?\Symfony\Component\VarExporter\Tests\Bar
- {
- if (isset($this->lazyObjectState)) {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->foo1(...\func_get_args());
- }
-
- return throw new \BadMethodCallException('Cannot forward abstract method "Symfony\Component\VarExporter\Tests\TestForProxyHelperInterface1::foo1()".');
- }
-
- public function foo2(?\Symfony\Component\VarExporter\Tests\Bar $b, ...$d): \Symfony\Component\VarExporter\Tests\TestForProxyHelperInterface2
- {
- if (isset($this->lazyObjectState)) {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->foo2(...\func_get_args());
- }
-
- return throw new \BadMethodCallException('Cannot forward abstract method "Symfony\Component\VarExporter\Tests\TestForProxyHelperInterface2::foo2()".');
- }
-
- public static function foo3(): string
- {
- throw new \BadMethodCallException('Cannot forward abstract method "Symfony\Component\VarExporter\Tests\TestForProxyHelperInterface2::foo3()".');
- }
- }
-
- // Help opcache.preload discover always-needed symbols
- class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class);
- class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class);
- class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class);
-
- EOPHP;
-
- $this->assertSame($expected, ProxyHelper::generateLazyProxy(null, [new \ReflectionClass(TestForProxyHelperInterface1::class), new \ReflectionClass(TestForProxyHelperInterface2::class)]));
- }
-
- public static function classWithUnserializeMagicMethodProvider(): iterable
- {
- yield 'not type hinted __unserialize method' => [new class {
- public function __unserialize($array): void
- {
- }
- }, <<<'EOPHP'
- implements \Symfony\Component\VarExporter\LazyObjectInterface
- {
- use \Symfony\Component\VarExporter\LazyProxyTrait {
- __unserialize as private __doUnserialize;
- }
-
- private const LAZY_OBJECT_PROPERTY_SCOPES = [];
-
- public function __unserialize($data): void
- {
- $this->__doUnserialize($data);
- }
- }
- EOPHP];
-
- yield 'type hinted __unserialize method' => [new class {
- public function __unserialize(array $array): void
- {
- }
- }, <<<'EOPHP'
- implements \Symfony\Component\VarExporter\LazyObjectInterface
- {
- use \Symfony\Component\VarExporter\LazyProxyTrait;
-
- private const LAZY_OBJECT_PROPERTY_SCOPES = [];
- }
- EOPHP];
- }
-
- public function testAttributes()
- {
- $expected = <<<'EOPHP'
-
- public function foo(#[\SensitiveParameter] $a): int
- {
- if (isset($this->lazyObjectState)) {
- return ($this->lazyObjectState->realInstance ??= ($this->lazyObjectState->initializer)())->foo(...\func_get_args());
- }
-
- return parent::foo(...\func_get_args());
- }
- }
-
- EOPHP;
-
- $class = new \ReflectionClass(new class {
- #[SomeAttribute]
- public function foo(#[\SensitiveParameter, AnotherAttribute] $a): int
- {
- }
- });
-
- $this->assertStringContainsString($expected, ProxyHelper::generateLazyProxy($class));
- }
-
- public function testCannotGenerateGhostForStringMagicGet()
- {
- $this->expectException(LogicException::class);
- ProxyHelper::generateLazyGhost(new \ReflectionClass(StringMagicGetClass::class));
- }
-
- public function testNullStandaloneReturnType()
- {
- self::assertStringContainsString(
- 'public function foo(): null',
- ProxyHelper::generateLazyProxy(new \ReflectionClass(Php82NullStandaloneReturnType::class))
- );
- }
-}
diff --git a/src/Symfony/Component/VarExporter/Tests/ProxyHelperTest.php b/src/Symfony/Component/VarExporter/Tests/ProxyHelperTest.php
index ab396bc902ce6..0bf8cda8ba746 100644
--- a/src/Symfony/Component/VarExporter/Tests/ProxyHelperTest.php
+++ b/src/Symfony/Component/VarExporter/Tests/ProxyHelperTest.php
@@ -16,9 +16,6 @@
use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\Hooked;
use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\Php82NullStandaloneReturnType;
-/**
- * @requires PHP 8.4
- */
class ProxyHelperTest extends TestCase
{
/**
@@ -282,9 +279,6 @@ public function testNullStandaloneReturnType()
);
}
- /**
- * @requires PHP 8.4
- */
public function testPropertyHooks()
{
$proxyCode = ProxyHelper::generateLazyProxy(new \ReflectionClass(Hooked::class));
diff --git a/src/Symfony/Component/VarExporter/Tests/VarExporterTest.php b/src/Symfony/Component/VarExporter/Tests/VarExporterTest.php
index 6ca98b91487aa..855684e8aea44 100644
--- a/src/Symfony/Component/VarExporter/Tests/VarExporterTest.php
+++ b/src/Symfony/Component/VarExporter/Tests/VarExporterTest.php
@@ -237,10 +237,6 @@ public static function provideExport()
yield ['unit-enum', [FooUnitEnum::Bar], true];
yield ['readonly', new FooReadonly('k', 'v')];
- if (\PHP_VERSION_ID < 80400) {
- return;
- }
-
yield ['backed-property', new BackedProperty('name')];
}