Sorry for the typos in my previous message. I stand corrected, it is > setcookie('name', 'value', 1, new Foo()); instead of > setcookie('name', 'value', 1, => new Foo()); and here is the fixed test file: --TEST-- setcookie() sends header before throwing `Error` exception --FILE-- <?php ob_start(); class Foo{ } try { setcookie('name', 'value', array( 'expires' => 1, 'path' => new Foo() )); } catch (\Error $e) { echo $e->getMessage() . "\n"; } var_dump(headers_list()); echo "Done\n"; ?> --EXPECTHEADERS-- --EXPECTF-- Object of class Foo could not be converted to string array(1) { [0]=> string(23) "X-Powered-By: PHP/8.0.3" } Done