ID: 44807 Updated by: [EMAIL PROTECTED] Reported By: agostone at freemail dot hu -Status: Assigned +Status: Bogus Bug Type: Scripting Engine problem PHP Version: 5.2CVS-2008-04-24 Assigned To: colder New Comment:
Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://www.php.net/manual/ and the instructions on how to report a bug at http://bugs.php.net/how-to-report.php It won't get fixed, as a fix would require a method name comparison for each and every method calls. It's not worth it. Previous Comments: ------------------------------------------------------------------------ [2008-07-21 12:17:49] [EMAIL PROTECTED] Not os specific, assign to Etienne for now. ------------------------------------------------------------------------ [2008-04-25 08:16:33] agostone at freemail dot hu I happen to experience this problem with magic functions only, i understand what You wrote, still, the question is there... May i hope that You guys will put this "expected" behavior into the bug fix chain or should i accept the fact that it won't get fixed ever? ------------------------------------------------------------------------ [2008-04-24 22:18:02] [EMAIL PROTECTED] This is "expected", the recursion protection that allows you to dynamically create properties inside __set is not enabled before the first __set called via overloading. Example: class A { public function __set($n, $v) { echo "Setting $n = $v\n"; $this->$n = $v; } } $a = new A; $a->k1 = "v1"; $a->__set("k2", "v2"); Will end up outputting: Setting k1 = v1 Setting k2 = v2 Setting k2 = v2 because the recursion protection isn't there when you do a manual call to __set(). ------------------------------------------------------------------------ [2008-04-24 21:57:56] agostone at freemail dot hu I've deleted my php installation, kept only php.ini. downloaded and installed php from this location it: http://snaps.php.net/win32/php5.2-win32-latest.zip Executed the code, here are the results: Calling: setRaw() Class: A| Passed Value:shouldn't be prefixed Class: B| Passed Value:shouldn't be prefixed Class: A| Passed Value:(prefixed) shouldn't be prefixed Calling: __set() Class: B| Passed Value:should be prefixed Class: A| Passed Value:(prefixed) should be prefixed Variable after setraw: (prefixed) shouldn't be prefixed Variable after set: (prefixed) should be prefixed Seems it still exists. ------------------------------------------------------------------------ [2008-04-23 14:09:33] agostone at freemail dot hu Description: ------------ If i have an overloaded __set function in a class and call parent::__set from another function, the parent calls the child's __set back and a loop gets created like this: parent::__set (initial call) child::_set parent::_set I need __set function to do some prefixing by default when assigning new string properties by default, i need a custom function to assign un-prefixed properties too, if there is a need (will happen very rarely)... I need this to auto prefix string variables passed to my view object (they gotta be passed as object properties), the MVC framework is a 3rd party framework, i'm extending it's view object and i don't want to modify the original source... Reproduce code: --------------- <?php class A { public function __set($pKey, $pValue) { echo("Class: ".get_class()."| Passed Value:".$pValue."<BR>"); $this->$pKey = $pValue; return true; } } class B extends A { function setRaw($pKey, $pValue) { parent::__set($pKey, $pValue); } function __set($pKey, $pValue) { echo("Class: ".get_class()."| Passed Value:".$pValue."<BR>"); $pValue = $this->prefix($pValue); parent::__set($pKey, $pValue); } function prefix($pValue) { if(is_string($pValue)) { return "(prefixed) ".$pValue; } return $pValue; } } $b = new B(); echo("Calling: setRaw()<br>"); $b->setRaw("raw", "shouldn't be prefixed"); echo("<br>"); echo("Calling: __set()<br>"); $b->prefixed = "should be prefixed"; echo("<br>Variable after setraw: ".$b->raw); echo("<br>Variable after set: ".$b->prefixed); echo("<br>"); ?> Expected result: ---------------- Calling: setRaw() Class: A| Passed Value:shouldn't be prefixed Calling: __set() Class: B| Passed Value:should be prefixed Class: A| Passed Value:(prefixed) should be prefixed Variable after setRaw: shouldn't be prefixed Variable after set: (prefixed) should be prefixed Actual result: -------------- Calling: setRaw() Class: A| Passed Value:shouldn't be prefixed Class: B| Passed Value:shouldn't be prefixed Class: A| Passed Value:(prefixed) shouldn't be prefixed Calling: __set() Class: B| Passed Value:should be prefixed Class: A| Passed Value:(prefixed) should be prefixed Variable after setraw: (prefixed) shouldn't be prefixed Variable after set: (prefixed) should be prefixed ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=44807&edit=1