Edit report at https://bugs.php.net/bug.php?id=52339&edit=1
ID: 52339 Comment by: pwolfenden at qualys dot com Reported by: dangerous dot ben at gmail dot com Summary: SPL autoloader breaks class_exists() Status: Re-Opened Type: Bug Package: SPL related Operating System: any (debian) PHP Version: 5.3.3RC2 Block user comment: N Private report: N New Comment: Although I have not yet migrated to 5.3, I care about this bug because I'm using an autoload function (in 5.2) which contains some directory traversal logic and uses class_exists() to decide whether or not to keep looking. I need to do this because I'm in the scenario described by james (and so cannot assume that all the package files in my codebase follow my preferred naming convention), and I would much prefer class_exists() to continue to return false rather than having it throw a new Exception. Previous Comments: ------------------------------------------------------------------------ [2012-02-03 00:01:46] frozenf...@php.net Re-opening, as there still exists the conflict of class_exists() generating an error when autoloading fails, which is a chicken and the egg sort of issue. If one wants to try autoloading if the class doesn't exist, but autoloading fails, it should be possible to recover from that failure. My understanding of the underlying code is that it generates an error in this case. Perhaps it should generate an exception, which can be caught an handled. ------------------------------------------------------------------------ [2010-10-11 21:37:47] james at nearlysensical dot com I 100% agree with dangerous dot ben. class_exists should return false if the class can't be autoloaded. Allowing it to do so would make it much easier to use an autoloader in contexts where you're interacting with an existing codebase that may not be so spl_autoload friendly. Bump. ------------------------------------------------------------------------ [2010-07-15 08:18:01] dangerous dot ben at gmail dot com I beg to differ. As you say, class_exists() attempts to autoload if there second param is true, but if autoloading fails it should simply return false as usual rather than throw an exception. Otherwise it is rather useless. The fact that this only occurs when there isn't another autoloader in the stack should make it clear that this is a bug. For example, the following code does not throw an exception: spl_autoload_register(); spl_autoload_register(function(){}); class_exists('foo\bar'); ------------------------------------------------------------------------ [2010-07-15 05:11:04] ka...@php.net You are calling class_exists() with just a class name, which leaves the second parameter ($autoload) set to true, which then invokes SPL and throws the exception, so no bug here ------------------------------------------------------------------------ [2010-07-14 21:54:08] dangerous dot ben at gmail dot com On further investigation, it appears that the error is meant to happen only if spl_autoload is called directly, and not via spl_autoload_call. Unfortunately when spl_autoload is the only autoloader in the stack it gets called directly and spl_autoload_call doesn't get a look in. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=52339 -- Edit this bug report at https://bugs.php.net/bug.php?id=52339&edit=1