On 01/18/2015 02:08 PM, Rasmus Lerdorf wrote:
> We have to be really really careful with this "oh, that code is wrong,
> so we can break it argument". This will break hundreds if not thousands
> of sites in a hard-to-debug way. It took me less than a minute of
> looking on Github to find a case that will break:
> 
> https://github.com/chenboking/service.downloadmanager.amule/blob/cda510415f9a58660e096a7de42b3ea6f39ee851/webserver/php-default/amuleweb-main-search.php#L121
> 
> It is extremely common to just do a less-than or a greater-than check in
> a user comparison function. Of course it isn't textbook-correct, but
> since it has always worked, people do it.

And just to further illustrate this, I just downloaded the current
Wordpress release and sure enough, Wordpress would also be broken by
this change.

In http://core.svn.wordpress.org/trunk/wp-includes/class-simplepie.php
look at the sort_items() method:

        /**
         * Sorting callback for items
         *
         * @access private
         * @param SimplePie $a
         * @param SimplePie $b
         * @return boolean
         */
        public static function sort_items($a, $b)
        {
                return $a->get_date('U') <= $b->get_date('U');
        }

I am not saying we should revert the change, but we need to be very
aware of the effect this change will have on PHP7 adoption. The really
nasty part is that even if a big codebase has unit tests covering the
code, unless the unit test actually tests an array with more than 16
elements, all tests will pass and the application will only fail in
production with production data. And there are no errors or warnings of
any sort either that will help people track this down.

This will need to be front and center in the UPGRADING doc with an
explanation about how to write a proper ordering function.

-Rasmus

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to