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
signature.asc
Description: OpenPGP digital signature