Skip to content

Commit 55a46e7

Browse files
committed
evaluate access flags for properties with asymmetric visibility
1 parent 8c8bab2 commit 55a46e7

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -581,8 +581,12 @@ private function isAllowedProperty(string $class, string $property, bool $writeA
581581
return false;
582582
}
583583

584-
if (\PHP_VERSION_ID >= 80400 && ($reflectionProperty->isProtectedSet() || $reflectionProperty->isPrivateSet())) {
585-
return false;
584+
if (\PHP_VERSION_ID >= 80400 && $reflectionProperty->isProtectedSet()) {
585+
return (bool) ($this->propertyReflectionFlags & \ReflectionProperty::IS_PROTECTED);
586+
}
587+
588+
if (\PHP_VERSION_ID >= 80400 && $reflectionProperty->isPrivateSet()) {
589+
return (bool) ($this->propertyReflectionFlags & \ReflectionProperty::IS_PRIVATE);
586590
}
587591

588592
if (\PHP_VERSION_ID >= 80400 &&$reflectionProperty->isVirtual() && !$reflectionProperty->hasHook(\PropertyHookType::Set)) {

src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,51 @@ public function testAsymmetricVisibility()
672672
$this->assertFalse($this->extractor->isWritable(AsymmetricVisibility::class, 'protectedPrivate'));
673673
}
674674

675+
/**
676+
* @requires PHP 8.4
677+
*/
678+
public function testAsymmetricVisibilityAllowPublicOnly()
679+
{
680+
$extractor = new ReflectionExtractor(null, null, null, true, ReflectionExtractor::ALLOW_PUBLIC);
681+
682+
$this->assertTrue($extractor->isReadable(AsymmetricVisibility::class, 'publicPrivate'));
683+
$this->assertTrue($extractor->isReadable(AsymmetricVisibility::class, 'publicProtected'));
684+
$this->assertFalse($extractor->isReadable(AsymmetricVisibility::class, 'protectedPrivate'));
685+
$this->assertFalse($extractor->isWritable(AsymmetricVisibility::class, 'publicPrivate'));
686+
$this->assertFalse($extractor->isWritable(AsymmetricVisibility::class, 'publicProtected'));
687+
$this->assertFalse($extractor->isWritable(AsymmetricVisibility::class, 'protectedPrivate'));
688+
}
689+
690+
/**
691+
* @requires PHP 8.4
692+
*/
693+
public function testAsymmetricVisibilityAllowProtectedOnly()
694+
{
695+
$extractor = new ReflectionExtractor(null, null, null, true, ReflectionExtractor::ALLOW_PROTECTED);
696+
697+
$this->assertFalse($extractor->isReadable(AsymmetricVisibility::class, 'publicPrivate'));
698+
$this->assertFalse($extractor->isReadable(AsymmetricVisibility::class, 'publicProtected'));
699+
$this->assertTrue($extractor->isReadable(AsymmetricVisibility::class, 'protectedPrivate'));
700+
$this->assertFalse($extractor->isWritable(AsymmetricVisibility::class, 'publicPrivate'));
701+
$this->assertTrue($extractor->isWritable(AsymmetricVisibility::class, 'publicProtected'));
702+
$this->assertFalse($extractor->isWritable(AsymmetricVisibility::class, 'protectedPrivate'));
703+
}
704+
705+
/**
706+
* @requires PHP 8.4
707+
*/
708+
public function testAsymmetricVisibilityAllowPrivateOnly()
709+
{
710+
$extractor = new ReflectionExtractor(null, null, null, true, ReflectionExtractor::ALLOW_PRIVATE);
711+
712+
$this->assertFalse($extractor->isReadable(AsymmetricVisibility::class, 'publicPrivate'));
713+
$this->assertFalse($extractor->isReadable(AsymmetricVisibility::class, 'publicProtected'));
714+
$this->assertFalse($extractor->isReadable(AsymmetricVisibility::class, 'protectedPrivate'));
715+
$this->assertTrue($extractor->isWritable(AsymmetricVisibility::class, 'publicPrivate'));
716+
$this->assertFalse($extractor->isWritable(AsymmetricVisibility::class, 'publicProtected'));
717+
$this->assertTrue($extractor->isWritable(AsymmetricVisibility::class, 'protectedPrivate'));
718+
}
719+
675720
/**
676721
* @requires PHP 8.4
677722
*/

0 commit comments

Comments
 (0)