Edit report at http://bugs.php.net/bug.php?id=52412&edit=1
ID: 52412 Comment by: michael at squiloople dot com Reported by: madboyka at yahoo dot com Summary: __autoload fails to throw exception when calling a static method on the class Status: Bogus Type: Bug Package: Scripting Engine problem Operating System: * PHP Version: 5.3.3 Block user comment: N Private report: N New Comment: Here's a request to re-open the bug, for it is indeed a bug: exceptions can be thrown and caught if the method called is _not_ static, as documented, but cannot be thrown and caught if the method _is_ static (and where the class name is not a variable), which is both inconsistent and against the documentation. It is _unexpected_ behaviour. Previous Comments: ------------------------------------------------------------------------ [2011-02-16 15:31:49] madboyka at yahoo dot com To: der...@php.net I don't think you've read the documentation on autoloading yourself: http://www.php.net/manual/en/language.oop5.autoload.php The first note states that since PHP 5.3, you may throw an exception from the autoload function (even if the class can be loaded) and catch that exception without a problem. Examples #3 and #4 in the documentation entry demonstrate this. This works when the autoload function gets invoked when instantiating a class, but doesn't when you make a static call on it. This behavior is not consistent. Also, take a look at michael@...'s workaround, which unexpectedly works great. And don't tell me that PHP behaves as "expected". I understand, that this is not a major bug, we all can live without a fix, but at least mark it as to be fixed in the far future. ------------------------------------------------------------------------ [2011-02-16 11:24:38] der...@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 FWIW, this is "expected". The __autoload() method is the last line of defense for PHP to find a class definition. If it can't find it, PHP bails out with a fatal error. If you throw an exception, you basically abort this final chance, and thus gives PHP you that fatal "can not find class" error. However, you can catch the exception in the __autoload() method, ------------------------------------------------------------------------ [2011-02-16 08:05:14] michael at squiloople dot com There's a slight hack of a solution tested using PHP 5.3.5 and Windows Vista: use a variable as the class name: function __autoload($class) { if (!include $class . '.php') { throw new Exception('Cannot autoload ' . $class); } } $class = 'Application'; try { $class::start(); } catch (Exception $e) { echo $e->getMessage(); } // Outputs the exception as expected. ------------------------------------------------------------------------ [2010-09-25 23:39:25] alex dot offshore at gmail dot com Temporary solution. Caveats and notices: - The class actually WILL BE DEFINED ANYWAY; - 'eval' usage; - __callStatic used to avoid "method not found" error. <?php function __autoload($className) { echo "Want to load $className.\n"; // assuming we can not load class // error handling code { eval('class ' . $className . ' { static function __callStatic($n, $a) { return false; } }'); throw new Exception("Unable to load $className."); } } try { //new MissingClass(); // works as expected MissingClass::someFunction(); } catch (Exception $e) { echo 'CAUGHT: ' . $e->getMessage(), "\n"; } ------------------------------------------------------------------------ [2010-09-03 03:26:56] php dot net at phrozenbyte dot de Same on Ubuntu 10.04 / Apache 2.2 and CLI mode Test script: --------------- <?php spl_autoload_register( function($autoload) { throw new Exception(); } ); try { Foo::bar(); } catch(Exception $e) { echo "Exception caught\n"; } ?> Expected result: ---------------- Exception caught Actual result: -------------- Fatal error: Class 'Foo' not found in /home/daniel/www/other/php-bug.php on line 0 ------------------------------------------------------------------------ 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 http://bugs.php.net/bug.php?id=52412 -- Edit this bug report at http://bugs.php.net/bug.php?id=52412&edit=1