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

Reply via email to