From: jr at terragate dot net
Operating system: Mac OS X 10.4.1
PHP version: 5CVS-2005-06-15 (dev)
PHP Bug Type: SPL related
Bug description: SPL throws E_STRICT warnings as exceptions
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 bug report at http://bugs.php.net/?id=33355&edit=1
--
Try a CVS snapshot (php4): http://bugs.php.net/fix.php?id=33355&r=trysnapshot4
Try a CVS snapshot (php5.0):
http://bugs.php.net/fix.php?id=33355&r=trysnapshot50
Try a CVS snapshot (php5.1):
http://bugs.php.net/fix.php?id=33355&r=trysnapshot51
Fixed in CVS: http://bugs.php.net/fix.php?id=33355&r=fixedcvs
Fixed in release: http://bugs.php.net/fix.php?id=33355&r=alreadyfixed
Need backtrace: http://bugs.php.net/fix.php?id=33355&r=needtrace
Need Reproduce Script: http://bugs.php.net/fix.php?id=33355&r=needscript
Try newer version: http://bugs.php.net/fix.php?id=33355&r=oldversion
Not developer issue: http://bugs.php.net/fix.php?id=33355&r=support
Expected behavior: http://bugs.php.net/fix.php?id=33355&r=notwrong
Not enough info:
http://bugs.php.net/fix.php?id=33355&r=notenoughinfo
Submitted twice:
http://bugs.php.net/fix.php?id=33355&r=submittedtwice
register_globals: http://bugs.php.net/fix.php?id=33355&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=33355&r=php3
Daylight Savings: http://bugs.php.net/fix.php?id=33355&r=dst
IIS Stability: http://bugs.php.net/fix.php?id=33355&r=isapi
Install GNU Sed: http://bugs.php.net/fix.php?id=33355&r=gnused
Floating point limitations: http://bugs.php.net/fix.php?id=33355&r=float
No Zend Extensions: http://bugs.php.net/fix.php?id=33355&r=nozend
MySQL Configuration Error: http://bugs.php.net/fix.php?id=33355&r=mysqlcfg