Bug #76980 [Opn]: Interface gets skipped if autoloader throws an exception
Edit report at https://bugs.php.net/bug.php?id=76980&edit=1
ID: 76980
Updated by: nikic@php.net
Reported by: martin at auswoeger dot com
Summary: Interface gets skipped if autoloader throws an
exception
Status: Open
Type: Bug
Package: *General Issues
PHP Version: 7.2.10
Block user comment: N
Private report: N
New Comment:
> What's the expected *behavior* here? That Foo should not be defined at all since the
> interface couldn't be loaded?
Yes, that would be the expected behavior.
Master has some changes that should make it easier to correctly handle this. Right now the code
segfaults though.
Previous Comments:
------------------------------------------------------------------------
[2018-10-06 21:56:20] requinix@php.net
What's the expected *behavior* here? That Foo should not be defined at all since the interface
couldn't be loaded? And the second "load" of Foo trigger the autoloader again and
raise the exception again?
I think the way it works now is fine: Foo could be mostly defined except the interface, there was no
other problem with it, and PHP was quite happy to raise an exception which you totally ignored. At
least this way the code has a chance of working.
Or what if the exception was actually an Error? It's semantics, but that way you wouldn't
accidentally catch it.
------------------------------------------------------------------------
[2018-10-06 21:38:23] martin at auswoeger dot com
Description:
------------
If a class implements an interface for which the registered autoloader throws an exception, the
class is actually defined afterwards but without the interface.
Test script:
---------------
<?php
spl_autoload_register(function ($class) {
if ('Foo' === $class) {
class Foo implements Foointerface {}
} elseif ('Foointerface' === $class) {
throw new Exception();
}
});
try {
// First call triggers the autoloader
new Foo();
} catch (Exception $e) {}
// For the second call Foo is loaded
var_dump(new Foo());
// Even though itâs missing the interface
var_dump(new Foo() instanceof Foointerface);
var_dump((new ReflectionClass('Foo'))->getInterfaces());
Expected result:
----------------
Fatal error: Uncaught Exception in â¦
thrown in ⦠on line 7
Actual result:
--------------
object(Foo)#3 (0) {
}
bool(false)
array(0) {
}
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=76980&edit=1
Thread (10 messages)