diff --git a/src/Rules/Properties/AccessPropertiesCheck.php b/src/Rules/Properties/AccessPropertiesCheck.php index b1e0514e8e3..05402130386 100644 --- a/src/Rules/Properties/AccessPropertiesCheck.php +++ b/src/Rules/Properties/AccessPropertiesCheck.php @@ -144,6 +144,10 @@ private function processSingleProperty(Scope $scope, PropertyFetch $node, string if ($maybePropertyReflection !== null && $maybePropertyReflection->isDummy()->no()) { return []; } + + if ($type->getObjectClassNames() === []) { + return []; + } } } diff --git a/tests/PHPStan/Analyser/AnalyserWithCheckDynamicPropertiesTest.php b/tests/PHPStan/Analyser/AnalyserWithCheckDynamicPropertiesTest.php index b6a160de932..5538225e419 100644 --- a/tests/PHPStan/Analyser/AnalyserWithCheckDynamicPropertiesTest.php +++ b/tests/PHPStan/Analyser/AnalyserWithCheckDynamicPropertiesTest.php @@ -12,9 +12,7 @@ class AnalyserWithCheckDynamicPropertiesTest extends PHPStanTestCase public function testBug13529(): void { $errors = $this->runAnalyse(__DIR__ . '/data/bug-13529.php'); - $this->assertCount(1, $errors); - $this->assertSame('Access to an undefined property object::$bar.', $errors[0]->getMessage()); - $this->assertSame(8, $errors[0]->getLine()); + $this->assertCount(0, $errors); } /** diff --git a/tests/PHPStan/Rules/Properties/AccessPropertiesRuleTest.php b/tests/PHPStan/Rules/Properties/AccessPropertiesRuleTest.php index eeda2fb9222..674dd0beb77 100644 --- a/tests/PHPStan/Rules/Properties/AccessPropertiesRuleTest.php +++ b/tests/PHPStan/Rules/Properties/AccessPropertiesRuleTest.php @@ -1272,4 +1272,18 @@ public function testBug13537(): void $this->analyse([__DIR__ . '/data/bug-13537.php'], $errors); } + public function testBug13539(): void + { + $this->checkThisOnly = false; + $this->checkUnionTypes = true; + $this->checkDynamicProperties = true; + $this->analyse([__DIR__ . '/data/bug-13539.php'], [ + [ + 'Access to an undefined property object::$baz.', + 29, + 'Learn more: https://phpstan.org/blog/solving-phpstan-access-to-undefined-property', + ], + ]); + } + } diff --git a/tests/PHPStan/Rules/Properties/data/bug-13539.php b/tests/PHPStan/Rules/Properties/data/bug-13539.php new file mode 100644 index 00000000000..845c927a48c --- /dev/null +++ b/tests/PHPStan/Rules/Properties/data/bug-13539.php @@ -0,0 +1,31 @@ +foo) || !isset($tmp->bar)) { + } +} + +function works(string $x): void { + $tmp = json_decode($x, false); + if (!isset($tmp->foo, $tmp->bar)) { + } +} + +function works_too(string $x): void { + /** @var stdClass $tmp */ + $tmp = json_decode($x, false); + if (!isset($tmp->foo) || !isset($tmp->bar)) { + } +} + +/** + * @param mixed $tmp + */ +function also_ok($tmp): void { + if (isset($tmp->foo) && isset($tmp->bar)) { + echo $tmp->foo; + echo $tmp->bar; + echo $tmp->baz; // intentional: baz not checked by isset + } +}