|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2010-07-23 09:34 UTC] madboyka at yahoo dot com
Description:
------------
I've tried to do the following:
1. Wrote and autoload method, that throws an exception.
3. Made a static call on a non-existing class within a try block.
Tried this on windows 7 / Apache 2.2 / PHP 5.3.3.
Test script:
---------------
<?php
function __autoload($class_name) {
throw new Exception($class_name);
}
try {
Application::start();
// new Application(); works fine
} catch (Exception $ex) {
var_dump($ex);
}
Expected result:
----------------
The script should var_dump() an exception with the Message 'Application' as it does when instantiating a class.
Actual result:
--------------
The script dies with Fatal error: Class 'Application' not found.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 08:00:01 2025 UTC |
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 0Temporary 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"; }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.