Bug #72194 [Opn->Wfx]: unset() on declared class properties undeclares it partially

From: Date: Tue, 23 Nov 2021 17:13:20 +0000
Subject: Bug #72194 [Opn->Wfx]: unset() on declared class properties undeclares it partially
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-237950@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=72194&edit=1 ID: 72194 Updated by: cmb@php.net Reported by: pierre dot rineau at makina-corpus dot com Summary: unset() on declared class properties undeclares it partially -Status: Open +Status: Wont fix Type: Bug Package: Reflection related Operating System: Any PHP Version: Irrelevant -Assigned To: +Assigned To: cmb Block user comment: N Private report: N New Comment: Bug #64497 has been closed as WONTFIX, so accordingly I'm closing this ticket as WONTFIX, too. Note that you can use ReflectionProperty::isInitialized() instead of property_exists() with the intended behavior[1]. [1] <https://3v4l.org/Ipqhf> Previous Comments: ------------------------------------------------------------------------ [2017-09-28 14:51:57] cmb@php.net Related to bug #64497. ------------------------------------------------------------------------ [2017-07-12 13:55:37] sean at m2mobi dot com This issue currently prevents me from using unittests for cleanup functions. I can't check if a protected class property has been unset because Reflection reports it as an "undefined property" afterwards. If it was null before however isset() will report FALSE before and after the unset and property_exists() will report TRUE before and after. This means I have no way to check if my unset happened, therefore I see this behaviour as a bug in reflection as the properties still exist. ------------------------------------------------------------------------ [2016-05-25 12:25:35] pierre dot rineau at makina-corpus dot com If you say that the unset()'d property becomes "undefined" and not null, then there is a logical problem: as a developer, there is absolutely no way writing PHP code to determine the difference between "undefined" and "null", then I cannot make my code more robust. In my opinion, this very edge case behaviour is a bug. ------------------------------------------------------------------------ [2016-05-15 14:46:38] bwoebi@php.net The property (as in property declaration) still exists. Only dynamic properties can completely vanish. The correct construct checking for existence of the property *value* is isset(). Note that unset() sets the value to undefined [not null!], but does not affect the existence of the property declaration if it is a declared one. class A { public $b; } $a = new A; var_dump(property_exists($a, "b")); // true var_dump(isset($a->b)); // false (as $a->b is null) var_dump($a->b); // null var_dump(property_exists($a, "c")); // false $a->c = 1; var_dump(property_exists($a, "c")); // true unset($a->c); var_dump(property_exists($a, "c")); // false unset($a->b); var_dump(property_exists($a, "b")); // true var_dump(isset($a->b)); // false (as $a->b is undefined) var_dump($a->b); // null and emits a notice ($a->b is undefined) It's true that you can trick code using it (wrongly); that code probably should be using isset(). property_exists() is really only meant to check the existence of declaration or it actually having a value. ------------------------------------------------------------------------ [2016-05-12 13:19:29] pierre dot rineau at makina-corpus dot com Yes, it is either one of: - property_exists() should not return true for unset() properties - unset() un-declares statically declared class properties ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=72194 -- Edit this bug report at https://bugs.php.net/bug.php?id=72194&edit=1

« previous php.bugs (#237950) next »