Bug #61442 [Nab]: SPL autoload issues Fatal Error if a handler throws exception
| From: | yks-uno at yandex dot ru | Date: | Wed, 19 Sep 2012 08:43:30 +0000 |
| Subject: | Bug #61442 [Nab]: SPL autoload issues Fatal Error if a handler throws exception | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-173554@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=61442&edit=1
ID: 61442
User updated by: yks-uno at yandex dot ru
Reported by: yks-uno at yandex dot ru
Summary: SPL autoload issues Fatal Error if a handler throws
exception
Status: Not a bug
Type: Bug
Package: SPL related
Operating System: Linux, FreeBSD
PHP Version: 5.3.10
Block user comment: N
Private report: N
New Comment:
Sorry but you're wrong. Do you understand what the function spl_autoload_register() does? And
what the function x() does? The function x() is a handler for loading classes - That is what
autoload handler SHOULD DO, it should LOAD classes which are NOT LOADED yet. And at the moment of
loading, you can not tell whether a class EXISTS or not. The test script is calling a method of a
class which is NOT LOADED yet.
It SHOULD report an error if the class being loaded is not found. But it SHOULD NOT DIE on
throwing an exception!!! This IS A BUG because an exception is not thrown where it is explicitly
written.
You cleverly advise me to use class_exists on a NOT LOADED class, so it just AGAIN forwards an
autoload call to the handler (function "x") which eventually DIES.
If you are so clever then just remove the autoload handler from PHP and force use require_once.
Sorry for my being angry, but, damn, it was a HALF-YEAR since bug submitted to invent such a stupid
reason that it is not a bug!!!
Previous Comments:
------------------------------------------------------------------------
[2012-09-19 07:44:46] laruence@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php
if you just want to check whether a class exists, use class_exists.
you test script is trying to call a method of a non-exists class, fatal error is
reasonable .
------------------------------------------------------------------------
[2012-09-19 07:15:33] yoorick at samovarchik dot info
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)
------------------------------------------------------------------------
[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