Edit report at http://bugs.php.net/bug.php?id=46560&edit=1

 ID:          46560
 Comment by:  dbforch at hotmail dot com
 Reported by: jonasraoni at gmail dot com
 Summary:     Addition of magic method "__valueOf" allowing object
              conversion to number
 Status:      Open
 Type:        Feature/Change Request
 Package:     Feature/Change Request
 PHP Version: 5.3.0alpha2

 New Comment:

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.


Previous Comments:
------------------------------------------------------------------------
[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 http://bugs.php.net/bug.php?id=46560&edit=1

Reply via email to