On Wed, Feb 11, 2015 at 7:36 AM, Rasmus Lerdorf <ras...@lerdorf.com> wrote: > On 02/10/2015 07:57 PM, Xinchen Hui wrote: >>> am I wrong?! >> seems I am wrong with this, it's a false alarm... it can restore >> automatically. > > Yeah, declare() doesn't span files so that isn't a problem. > > My worry is still the lack of type coercion for internal calls. I tested > it on some apps and it will take quite a bit of tedious and rather > useless effort to fix these to run in strict mode. Some examples of > common things that are fatal errors in strict mode: > > ini_set('precision', 14); > > ini_set('display_errors', 1); > > ini_set('display_errors', true); > > ok, not common, but tan(4/2) fatal, tan(5/2) no error > > Wordpress has this function, spot the error: > > function add_magic_quotes( $array ) { > foreach ( (array) $array as $k => $v ) { > if ( is_array( $v ) ) { > $array[$k] = add_magic_quotes( $v ); > } else { > $array[$k] = addslashes( $v ); > } > } > return $array; > } > > $v may not always be a string (it died with a float for me), so the > fix is to cast: > > $array[$k] = addslashes( (string)$v ); > > Also from Wordpress: > > $formatted = number_format( $number, absint( $decimals ), > $wp_locale->number_format['decimal_point'], > $wp_locale->number_format['thousands_sep'] ); > > Here number_format() is expecting a float but $number is a string. So > again, the only real fix is to cast. > > And in Drupal8 *without turning on strict*: > > use Drupal\Component\Utility\String; > > it dies with: "Fatal error: "string" cannot be used as a class name in > /var/www/drupal/core/includes/bootstrap.inc on line 11" > > That String class is everywhere in Drupal. They are going to have a > fun time with that. See > https://gist.githubusercontent.com/anonymous/d9252deeeb2aae1a5af5/raw/053155130d22551b1404d0a9b94e27424544b6d1/gistfile1 > > From Geeklog: > > if (strtolower($topic) != strtolower($archivetid)) { > $sql .= " AND ta.tid != '{$archivetid}' "; > } > > $topic can be null there. Looking at the logic, not really a bug, > just a natural reliance on null being coerced to "" > > Also from Geeklog: > > if( empty( $date )) { > // Date is empty, get current date/time > $stamp = time(); > } else if( is_numeric( $date )) { > // This is a timestamp > $stamp = $date; > } else { > // This is a string representation of a date/time > $stamp = strtotime( $date ); > } > // Format the date > $date = strftime( $dateformat, $stamp ); > > strftime() expects an integer for the timestamp there, but as the > above logic shows, they are expecting a numeric string to be fine. > No bug, just another forced cast. > > And another number_format() instance where arg1 is not necessarily > a float. Obviously not a bug, so we have to cast again: > > return number_format( $number, $dc, $ds, $ts ); > > In Opencart: > > $this->image = imagecreatetruecolor($width, $height); > imagecreatetruecolor() expects parameter 1 to be integer, string > given in /var/www/opencart/system/library/image.php on line 89 > > You could argue this is a bug, I guess, but the width and height are > coming from a database and are integers in the db, but since the db > returns strings. Another cast... > > I was genuinely hoping to find some bugs with this exercise. I suppose > it is because I did it on mature projects and at this stage those sorts > of bugs have already been fixed. But I still fear that people are going > to want to be enable strictness everywhere and then they will quickly > learn that they better cast stuff to be safe which makes the whole thing > rather pointless. And I feel pretty sorry for the Drupal folks. That > list of 1000+ instances of their String class is going to suck to fix. > > -Rasmus >
Helo, the Drupal thing seems scary. Also, I realized one thing why I think the strict version is a bad idea for PHP (in the state PHP is now - in an ideal world I would love to have nothing but strongly typed PHP, but that's offtopic) - PHP has many functions that return multiple types, so you cannot do foo(bar()) if bar() has multiple return types. :( Regards Pavel Kouril -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php