On Thu, Mar 1, 2012 at 8:33 AM, Lazare Inepologlou <linep...@gmail.com>wrote:
> Yes, I agree, the casting (or the failing to cast) has to happen on entry, > for the reasons that you have very well explained. > > However, I cannot understand what it means to cast an object to a scalar. > Does it always mean casting to string? Wouldn't that be slow in many cases? > Simple example: > I'm not sure I understand, so if I mischaracterize your concerns, please let me know. Of note, the scalar type hinting I've outlined does not automatically perform casts to any particular type of scalar. Rather, it would be the programmer's responsibility to perform the cast (as I performed in my example.) This way, only necessary, reasonable casts are performed, and information loss can be avoided. That said, in terms of performance, PHP's type juggling performs these types of casts all the time, so I don't think I'd be concerned. Any time we check for equality using ==, perform string concatenation with ints, etc., PHP's beautiful type juggling automatically performs these conversions for us without any effort on our part. I've never seen where this is the source of any performance issues in my profiling, but I must admit that I don't know the internals well enough to preclude this from ever being an issue. class A { > public $value = 1234; > public function __toString(){ return (string)$this->value; } > } > > function foo( int $x ) { // here "int" is used as an alias to "scalar" as > you suggest > return $x + 1; > } > > $a = new A; > foo( $a ); // casting $a to scalar upon calling, as it is possible after > all > > In this example, the integer value will have to be cast to a string only > to be cast back to integer (unless something else happens under the hoods > that I am not aware). > Speaking to your example, it would throw a catchable fatal error because the variable $a contains an object of type A and the function foo expects a scalar. The object would first have to be cast to a scalar. However, as you pointed out, currently objects can only implement the __toString() method (i.e., there's no __toInt, etc.), so one can't directly cast an object to an int. This seems contrived, though, because in the case of your example, if a function expects an integer, wouldn't you just call it with the appropriate object property: foo ($a->value); // works because the value property is a scalar (int) Thanks for your commentary :) Adam