Edit report at https://bugs.php.net/bug.php?id=61442&edit=1
ID: 61442
Comment by: yoorick at samovarchik dot info
Reported by: yks-uno at yandex dot ru
Summary: SPL autoload issues Fatal Error if a handler throws
exception
Status: Open
Type: Bug
Package: SPL related
Operating System: Linux, FreeBSD
PHP Version: 5.3.10
Block user comment: N
Private report: N
New Comment:
If you try to use a class constant (e.g. Foo::BAR) of an unexisting class,
autoloader will also fail to throw an exception and the script will die with
the "class not found" fatal error.
(PHP 5.3.16)
Previous Comments:
------------------------------------------------------------------------
[2012-03-19 19:18:01] yks-uno at yandex dot ru
Description:
------------
If a handler is registered for autoloading (whether via spl_autoload_register()
or __autoload()) and it throws an exception when a class is not found, the
exception can not be caught as usual if a method of the target class is
statically called. Instead, a Fatal Error: Class not found is issued (which is
quite what the autoloader is meant to avoid!)
Yet, when, e.g. trying to access a static field of that class, the exceptions
get caught correctly.
Tested on several PHP versions (5.3.3 - 5.3.10) on Linux and FreeBSD.
Test script:
---------------
<?
function x($class)
{
print "xxx\n"; // gets printed
throw new Exception("Class '{$class}' not found");
}
spl_autoload_register('x');
try {
$a = A::z(); // FATAL ERROR: class 'A' not found
// NOTE:
// $a = A::$z; - will be correctly caught
} catch (Exception $ex) {
print "{$ex}\n"; // never gets executed
}
Expected result:
----------------
xxx
exception 'Exception' with message 'Class 'A' not found' in <FILE>:5
---
this is what gets output in case the exception is caught
Actual result:
--------------
xxx
Fatal error: Class 'A' not found in <FILE> on line 10
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=61442&edit=1