UndefinedMagicPropertyFetch

Emitted when getting a property on an object that does not have that magic property defined

<?php

/**
 * @property string $bar
 */
class A {
    public function __get(string $name) {
        return "cool";
    }
}
$a = new A();
echo $a->foo;

To fix, add all used magic properties as @property annotations:

<?php

/**
 * @property string $bar
 * @property string $foo
 */
class A {
    /** @param mixed $value */
    public function __set(string $name, $value) {}
}
$a = new A();
echo $a->foo;

Or, only if dealing with generic container objects (like ArrayObject), use @psalm-no-seal-properties.

<?php

/** @psalm-no-seal-properties */
class ArrayBag {
    public function __construct(private array $arr = []) {}
    public function __set(string $k, mixed $v) {
        $this->arr[$k] = $v;
    }
    public function __get(string $k): mixed {
        return $this->arr[$k];
    }
}
$a = new ArrayBag(['bar' => 'foo']);
echo $a->bar;