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')];
}
pFad - Phonifier reborn
Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy