On 02/07/2015 05:03 PM, Pavel Kouřil wrote:
> I'm wishing more and more that the RFC doesn't pass (even though I'd
> LOVE to have typehints in PHP as a userland developer) and someone
> else will make a better version of typehints RFC for  PHP 7, because
> this one feels really like you took an ok-ish RFC (one that would be
> good for PHP) and slapped a strict typing on it without enough
> research about strong typing in other languages. And as I said myself
> multiple times in the past, the declare syntax IS just ugly (and
> changing how code works by writing one line is an ugly principle as
> well, IMHO). :(

I am not sure I would go that far. Andrea did plenty of research and has
tons of experience in other languages, I just think this approach is
misguided. I also wonder just how many people of those who voted even
bothered to download and try the patch. I tried it a while back on some
existing code and it was a nightmare. Does everyone realize that these
simple things break?

 tan(1);
 echo strstr("test", "est", 1);

Having absolutely no coercion for int to float and 0/1 to false/true,
especially for internal functions, is just too pedantic to me. I also
find this a bit hypocritical:

declare(strict_types=true);

outputs:

Fatal error: strict_types declaration must have 0 or 1 as its value

That is obviously nit-picking, but if we are going to get this pedantic...

And, you also have to realize that it isn't actually per file. For
example, this:

<?php
function myErrorHandler($errno, $errstr, $errfile, $errline) {
  if ($errno===E_RECOVERABLE_ERROR) {
    echo "\ncatchable fatal error\n";
    return true;
  }
  return false;
}
set_error_handler('myErrorHandler');

echo tan(1);
declare(strict_types=1);
echo tan(1);
declare(strict_types=0);
echo tan(1);

This will output:

1.5574077246549
catchable fatal error
1.5574077246549

The RFC refers to it as a per-file directive, which just means it
doesn't apply to files you include after setting it. It doesn't mean
that the entire file is affected. You can flip in and out of strict mode
at will. Which isn't necessarily a bad thing, but it can certainly get
confusing.

For example. Since everyone has already voted, you can all tell me what
this does, right?

1)
<?php
function do_something() {
  declare(strict_types=1);
}
echo tan(1);
do_something();
echo tan(1);

How about this:

2)
<?php
echo tan(1);
do_something();
echo tan(1);
function do_something() {
  declare(strict_types=1);
}

or this?

3)
<?php
function do_something() {
  declare(strict_types=1);
}
echo tan(1);
echo tan(1);

Answers:

1) fatal error on the first tan(1)
2) no errors
3) same as 1)

Basically declare() does not respect function scope, but it doesn't let
you know that. There is a reason we haven't used declare() for anything
real.

-Rasmus

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to