ID: 33355
Updated by: [EMAIL PROTECTED]
Reported By: jr at terragate dot net
-Status: Open
+Status: Assigned
Bug Type: SPL related
Operating System: Mac OS X 10.4.1
PHP Version: 5CVS-2005-06-15 (dev)
-Assigned To:
+Assigned To: helly
Previous Comments:
------------------------------------------------------------------------
[2005-06-15 17:14:00] jr at terragate dot net
Description:
------------
Currently SPL sets the error_handling to EH_THROW which will
cause any E_WARNING or E_STRICT message to be thrown as
exception regardless of error_reporting's settings.
This renders most code with compatibility in mind (e.g.
PEAR) useless in SPL context since there is no way to ignore
non fatal warnings.
At least E_STRICT messages shouldn't be thrown if it is
disabled in error_reporting.
But this might still be confusing. E_STRICT massages should
be treated as compile time warnings (as in most other
languages). They shouln't affect the control flow if not
explicitly requested.
Generally the same applies to E_WARNING and E_USER_WARNING
as long as there is no way to disable EH_THROW in user space
php code.
IMHO EH_THROW should be completly disabled or the error mode
should be made controlable:
// ignore warnings from this wrapper
error_mode(EH_NORMAL);
$it = new DirectoryIterator('legacywrapper://path/');
// I want to stop on some warnings
error_mode(EH_THROW);
try {
$it = new DirectoryIterator('legacywrapper://path/');
} catch(Exception $e) {
// parse exception which might contain an E_WARNING
message
// this is not really OO but it works
...
if($criticalWarning) {
// bail out
throw new AMoreAppropriateException();
} else {
// non critical warning trying again with EH_NORMAL
// using normal php error/warning handling here
...
}
}
As long as all warnings are thrown as 'Exception' the
EH_THROW mode can't be used as different warnings cannot be
easily distinguished.
Reproduce code:
---------------
<?php
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT);
class StreamWrapper
{
public function dir_opendir($path, $options) {
return !is_a(null, 'AKnownOrUnknownClass');
}
public function dir_readdir() {
return array();
}
}
stream_wrapper_register('test', 'StreamWrapper');
echo "Done\n";
?>
Expected result:
----------------
Output of "Done"
Actual result:
--------------
Fatal error: Uncaught exception 'Exception' with message 'is_a
(): Deprecated. Please use the instanceof operator' in /Users/
reith2/Projects/php/bug-new.php:8
Stack trace:
#0 /Users/reith2/Projects/php/bug-new.php(8): is_a(NULL,
'AKnownOrUnknown...')
#1 /Users/reith2/Projects/php/bug-new.php(18): StreamWrapper-
>dir_opendir('test://path/', 4)
#2 /Users/reith2/Projects/php/bug-new.php(18):
DirectoryIterator->__construct('test://path/')
#3 {main}
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=33355&edit=1