From 49126e146101be5fd9e3113406cd88e83b2eea55 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Thu, 21 Nov 2024 14:45:29 +0100 Subject: [PATCH] consider write property visibility to decide whether a property is writable --- .../Extractor/ReflectionExtractor.php | 4 ++++ .../Extractor/ReflectionExtractorTest.php | 14 ++++++++++++++ .../Tests/Fixtures/AsymmetricVisibility.php | 19 +++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 src/Symfony/Component/PropertyInfo/Tests/Fixtures/AsymmetricVisibility.php diff --git a/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php b/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php index 5119f28e2cfe0..141233f7afa0e 100644 --- a/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php +++ b/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php @@ -621,6 +621,10 @@ private function isAllowedProperty(string $class, string $property, bool $writeA return false; } + if (\PHP_VERSION_ID >= 80400 && $writeAccessRequired && ($reflectionProperty->isProtectedSet() || $reflectionProperty->isPrivateSet())) { + return false; + } + return (bool) ($reflectionProperty->getModifiers() & $this->propertyReflectionFlags); } catch (\ReflectionException $e) { // Return false if the property doesn't exist diff --git a/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php b/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php index 0fdab63361f5e..e659cfda7784a 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php +++ b/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php @@ -17,6 +17,7 @@ use Symfony\Component\PropertyInfo\PropertyReadInfo; use Symfony\Component\PropertyInfo\PropertyWriteInfo; use Symfony\Component\PropertyInfo\Tests\Fixtures\AdderRemoverDummy; +use Symfony\Component\PropertyInfo\Tests\Fixtures\AsymmetricVisibility; use Symfony\Component\PropertyInfo\Tests\Fixtures\DefaultValue; use Symfony\Component\PropertyInfo\Tests\Fixtures\Dummy; use Symfony\Component\PropertyInfo\Tests\Fixtures\NotInstantiable; @@ -685,4 +686,17 @@ public static function extractConstructorTypesProvider(): array ['ddd', null], ]; } + + /** + * @requires PHP 8.4 + */ + public function testAsymmetricVisibility() + { + $this->assertTrue($this->extractor->isReadable(AsymmetricVisibility::class, 'publicPrivate')); + $this->assertTrue($this->extractor->isReadable(AsymmetricVisibility::class, 'publicProtected')); + $this->assertFalse($this->extractor->isReadable(AsymmetricVisibility::class, 'protectedPrivate')); + $this->assertFalse($this->extractor->isWritable(AsymmetricVisibility::class, 'publicPrivate')); + $this->assertFalse($this->extractor->isWritable(AsymmetricVisibility::class, 'publicProtected')); + $this->assertFalse($this->extractor->isWritable(AsymmetricVisibility::class, 'protectedPrivate')); + } } diff --git a/src/Symfony/Component/PropertyInfo/Tests/Fixtures/AsymmetricVisibility.php b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/AsymmetricVisibility.php new file mode 100644 index 0000000000000..588c6ec11e971 --- /dev/null +++ b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/AsymmetricVisibility.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\PropertyInfo\Tests\Fixtures; + +class AsymmetricVisibility +{ + public private(set) mixed $publicPrivate; + public protected(set) mixed $publicProtected; + protected private(set) mixed $protectedPrivate; +}