Req #46560 [Fbk->Sus]: Addition of magic method "__valueOf" allowing object conversion to number

From: Date: Wed, 23 Dec 2020 17:16:23 +0000
Subject: Req #46560 [Fbk->Sus]: Addition of magic method "__valueOf" allowing object conversion to number
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-231244@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=46560&edit=1 ID: 46560 Updated by: cmb@php.net Reported by: jonasraoni at gmail dot com Summary: Addition of magic method "__valueOf" allowing object conversion to number -Status: Feedback +Status: Suspended Type: Feature/Change Request Package: Scripting Engine problem PHP Version: 5.3.0alpha2 -Assigned To: cmb +Assigned To: Block user comment: N Private report: N Previous Comments: ------------------------------------------------------------------------ [2020-12-23 17:16:16] cmb@php.net This feature requires the RFC process[1]. Feel free to start that process. For the time being, I'm suspending this ticket. [1] <https://wiki.php.net/rfc/howto> ------------------------------------------------------------------------ [2010-05-07 12:59:11] dbforch at hotmail dot com I totally agree. The SplType class (http://pecl.php.net/package/SPL_Types) is the only class I know of in PHP5 that is able to convert an Object to a number (I only manage to install it under PHP 5.2.10-2ubuntu6.4, all PHP 5.3.X versions were a no-go on make-errors). Code: ----- $i1 = new SplInt(11); $i2 = new SplInt(11); echo $i1+$i2; Result: ------- 22 The SplType also doesn't have a method (protected) to change the internal value when extending the SplInt with a custom defined class. Different values for $i1 and $i2 after initializing can only be set by unsetting it {unset($i1);$i1=new SplFloat(0.3)}. This makes it unusable in every way. The SplType::__constructor($initial_value, (bool) $strict) comes with a $strict value, this not only hides the warnings, it also does not change the values of the assigned variable as it should be. Code: ----- $i = new SplInt(12, $strict = false); $i = new SplFloat(10.244); echo $i; Expected Result: 10.244 Result: 10 The only possible solution I could think of to represent an Object as a number. Code: ----- class base { public function __toString() { return "11"; } // requested feature not used in the first example, but in the second public function __valueOf() { return 11; } } $c1 = new base; $c2 = new base; echo (string)$c1+(string)$c2; Result: ------- 22 By adding the requested magic function from 'jonasraoni at gmail dot com', you could produce the following code. Additional Code: ---------------- echo $c1.' + '.$c2.' = '.($c1+$c2); Result: ------- 11 + 11 = 22 Choices can be made in which situation to use the __toString and the __valueOf (or whatever name it should have). Second, representing an object as a number isn't that difficult. Looking at the source of SPL_Types, it really isn't that magical. ------------------------------------------------------------------------ [2008-11-12 22:47:54] jonasraoni at gmail dot com Description: ------------ In the current implementation it's impossible to convert an object to a number. I should exist a magic method called "__valueOf" which must return a float/int. In the case this magic method isn't declared , it should be returned a not zero value when converting to number (it happens, but generates the E_NOTICE anyway). Reproduce code: --------------- class Number{ private $value; public function __construct($n){ $this->value = +$n; } public function __toString(){ return (string)$this->value; } public function __valueOf(){ return $this->value; } } $n = new Number(2); echo $n . ':' . +$n; Expected result: ---------------- 2:2 Actual result: -------------- Notice: Object of class Number could not be converted to int in C:\test.php on line 16 2:1 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=46560&edit=1

« previous php.bugs (#231244) next »