Inline. Quoted portion edited extensively for brevity.

> -----Original Message-----
> From: Michael Morris [mailto:dmgx.mich...@gmail.com] 
>
> $a = 123;
> function foo ( int $i ) {}
> foo($a); // OK
>
> foo("123"); // NOTICE, because "123" is a constant
> 
> $a = "456";
> foo($a); // OK, because conversion is lossless
> 

-1. Should be no notice in either of the last two cases. Raising the notice 
when a constant is used is inconsistent and confusing. I also doubt that this 
sort of implementation is even possible without some pretty massive internal 
changes. Not worth it IMO.

> int $a = 123; // "type locked" to integer
> 
> $a = "456"; // E_NOTICE
>
> $a = "Hello World"; // E_NOTICE

I'm very dubious on hinting variables. This would require storing additional 
data with the variable, which (as far as I can see) would break binary 
compatibility (same problem as taint). I don't see much of a use for this most 
of the time, with the notable exception of member variables (sometimes type 
locking a class member would be really nice.)

Also, there should be no notice in case 2 (same argument as before with 
functions)

Notice on case 3 is fine

> 
> unset($a);
> $a = "Hello World"; // OK, because of unset
> 
> int $a; // E_NOTICE, $a had a value which can't convert without loss of data.

This just seems silly to me. Trying to declare int $a after $a is already 
present and set is a nonsense construct. I think E_RECOVERABLE_ERROR should be 
raised on this and $a should be set to null regardless of convertibility (the 
more likely intent and meaning of that line of code) in case the error handler 
decides to continue execution.

> scalar $a;

-1, I don't think we need this any more than we need an explicit "mixed" type. 
Saying "this function needs a number or it can't work" is one thing. There is a 
sound logical foundation for that. A scalar could be anything though. You're 
still going to have to check types to decide what you really have and alter 
code paths as appropriate.

> And if we don't want to unset $a but rather restore $a to behaving like a
> scalar, that is how it would be done.

-1, same argument as int $a; when $a is already set. This is a nonsensical 
construction. You are using a variable declaration like a typecast and reusing 
a variable. This is sloppy and confusing to reduce code in a badly structured 
edge case. If you really honestly must untype a local variable, you can always 
do this instead:

$tmp = $a;
unset($a);
$a = $tmp;

BUT, if there is any reason why you would actually need to untype a variable, 
then there are much bigger problems. This shouldn't be handled in the core 
language.

> So, in closing this ramble, if I right a db library whose functions are 
> datatyped
> you might see more notices, but the code will work and notices are usually 
> suppressed
> by default (yes, I know about the RFC to change that)

If using types causes a large number of unnecessary notices that's a spec 
problem. The core devs aren't going to accept that.

John Crenshaw
Priacta, Inc.

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to