Edit report at https://bugs.php.net/bug.php?id=50688&edit=1

 ID:                 50688
 Comment by:         m at rtin dot so
 Reported by:        jcampbell at remindermedia dot com
 Summary:            Using exceptions inside usort() callback function
                     causes a warning
 Status:             Assigned
 Type:               Bug
 Package:            Arrays related
 Operating System:   Fedora Core 12
 PHP Version:        5.*, 6
 Assigned To:        stas
 Block user comment: N
 Private report:     N

 New Comment:

Sorry the use () isn't relevant, I forgot to remove it when simplifying my test 
case


Previous Comments:
------------------------------------------------------------------------
[2013-08-19 18:23:17] m at rtin dot so

I ran into a similar issue, i'm sure it'll require the same patch as it's the 
backtrace causing the problem but worth noting it doesn't require an exception 
to 
trigger this, just a backtrace.

$ cat usort.php
<?php
 
set_error_handler(function($errno, $errstr) {
  $bt = debug_backtrace();
  var_dump($errstr);
});
 
$arr = [1, 2];
usort($arr, function($a, $b) use ($arr) {
  trigger_error('test');
  return $a > $b;
});
 
$ php usort.php
string(4) "test"
string(59) "usort(): Array was modified by the user comparison function"

------------------------------------------------------------------------
[2013-07-09 07:21:19] jakub dot lopuszanski at nasza-klasa dot pl

I'd like to add, that you do not have to throw an exception to get this warning.
Mere creating it, also triggers the warning, as in:

<?php
function comp($a,$b){
  @new Exception("dupa");
}
$a =array(1,2,3);
  usort($a, 'comp');
var_dump($a);
?>

PHP Warning:  usort(): Array was modified by the user comparison function in 
/home/jlopuszanski/test.php on line 6

------------------------------------------------------------------------
[2013-06-17 11:11:07] andrejs dot verza at gmail dot com

Php 5.4.16 also fails with this.
Still the same status for 3 and a half years old bug?!

------------------------------------------------------------------------
[2012-08-08 17:53:58] mbrowne83 at gmail dot com

This will probably be obvious to most, but I just wanted to mention that you 
can always prefix the usort function with the @ symbol to prevent the 
warning...of course that would also suppress any other types of notices or 
warnings that might occcur anywhere within the sorting function...

------------------------------------------------------------------------
[2012-02-24 18:04:02] keith at breadvault dot com

This same problem arises when using Mockery to mock the object whose method is 
being used by usort(), even though the method itself neither is mocked nor 
handles 
any exceptions. The proxy generated by Mockery must wrap the target class's 
methods with some exception-handling code.

Unfortunately this forced me to code a workaround that would not use usort. My 
hack extracts from the objects in the array the values being sorted on, sorts 
that 
array of values using asort() (to preserve the keys), and finally rebuilds the 
list of objects using the keys in the order that they appear in the asorted 
list 
of values. Yuck.

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=50688


-- 
Edit this bug report at https://bugs.php.net/bug.php?id=50688&edit=1

Reply via email to