Maybe you just can implements your own method to check? Like your exists() example.
Em sex, 4 de set de 2020 15:08, Michael Voříšek - ČVUT FEL < voris...@fel.cvut.cz> escreveu: > Your examples provide code for checking the existance of real > properties. But how to check existance of a magic one? > > The best is currently __isset(), but to comply with isset() definition, > it should not return true when the magic property has null value, thus I > belive, there is currently not way (provided by php language) to check > for existance of magic property. > > With kind regards / Mit freundlichen Grüßen / S přátelským pozdravem, > > Michael Voříšek > > On 4 Sep 2020 19:23, Marco Pivetta wrote: > > > Heya, > > > > On Fri, Sep 4, 2020 at 7:03 PM Michael Voříšek - ČVUT FEL < > voris...@fel.cvut.cz> wrote: > > > >> isset() returns false for null > >> > >> __isset() should return the same, but then if magic property with null > >> value exists, there is no way to detect it > >> > >> Example: https://3v4l.org/GqUsh > >> > >> this is currently an limitation of php > >> > >> Ideally, we should introduce __exist() which should return true even if > >> value is null and for BC autoimplement __isset() based on it and __get, > >> ie. > >> > >> function __isset($n) { return $this->__exist($n) && $this->__isset($n) > >> !== null; } > > > > I'd endorse **NOT** checking for property existence on objects that > don't have a clearly defined interface/type: that's something for a static > analyzer, not (usually) for runtime code. > > > > If you still need to do that (anti-patterns such as stuffing things in > `stdClass` instances), checking if a property is defined is trivial with > reflection: > > > > ```php > > <?php > > > > class SomethingMagicAndTerriblyUgly > > { > > public $foo = null; > > private $bar = null; > > } > > > > var_dump((new > ReflectionClass(SomethingMagicAndTerriblyUgly::class))->hasProperty('foo')); > > var_dump((new > ReflectionClass(SomethingMagicAndTerriblyUgly::class))->hasProperty('bar')); > > var_dump((new > ReflectionClass(SomethingMagicAndTerriblyUgly::class))->hasProperty('baz')); > > > ``` > > > > https://3v4l.org/pVC4j > > > > Checking if a **public** property exists at runtime is done via > `array_key_exists()`, not via `isset()`: > > > > ```php > > <?php > > > > class SomethingMagicAndTerriblyUgly > > { > > public $foo = null; > > private $bar = null; > > } > > > > var_dump(array_key_exists('foo', (array) (new > SomethingMagicAndTerriblyUgly))); > > var_dump(array_key_exists('bar', (array) (new > SomethingMagicAndTerriblyUgly))); > > ``` > > > > https://3v4l.org/ZLSjq > > > > Marco Pivetta > > > > http://twitter.com/Ocramius > > > > http://ocramius.github.com/