Bug #74372 [Csd]: autoloading file with syntax error uses next autoloader, may hide parse error

From: Date: Wed, 06 Dec 2017 22:39:52 +0000
Subject: Bug #74372 [Csd]: autoloading file with syntax error uses next autoloader, may hide parse error
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-212984@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=74372&edit=1

 ID:                 74372
 Updated by:         nikic@php.net
 Reported by:        lightnb at bellsouth dot net
 Summary:            autoloading file with syntax error uses next
                     autoloader, may hide parse error
 Status:             Closed
 Type:               Bug
 Package:            SPL related
 Operating System:   Ubuntu 16.04
 PHP Version:        7.0.17
-Assigned To:        
+Assigned To:        nikic
 Block user comment: N
 Private report:     N

 New Comment:

I've decided to fix this bug in master, despite the minor BC impact. An exception is an
exception and it better behave like one.


Previous Comments:
------------------------------------------------------------------------
[2017-12-06 22:37:08] nikic@php.net

Automatic comment on behalf of nikita.ppv@gmail.com
Revision: http://git.php.net/?p=php-src.git;a=commit;h=9cdd547ecad81fb4ea499db2f9a62be55b54390f
Log: Fixed bug #74372

------------------------------------------------------------------------
[2017-04-05 14:18:54] lightnb at bellsouth dot net

If that's the intended behavior, there should be a warning on the documentation page
(http://php.net/manual/en/function.spl-autoload-register.php) that informs developers they need to
have a custom error handler that shows all exceptions not just the last exception if they want to
know what actually went wrong when using multiple autoloaders.

The examples on PHP's exception page (http://php.net/manual/en/language.exceptions.php), along
with most other examples online, also don't mention the necessity for getPrevious() to find out
what went wrong.

As far as I know, the last exception is always the "real" problem in all other cases.

> An exception still gets thrown if one occurs, with the difference being that autoloading 
> continues and therefore the class could still be loaded before the exception goes up the call 
> stack.


If the class file has a parse error, it's unlikely that another auto-loader would be able to
load it instead.

I'm still not sure why anyone would want errors ignored and another autoloader tried when an
error occurs. If that was their intent, they could always use a try/catch in a custom autoload
function and suppress the error themselves. But it seems like the default behavior should be to stop
on errors since that would be the consistent and expected behavior.

------------------------------------------------------------------------
[2017-04-05 06:09:16] requinix@php.net

@lightnb: I had tried with the standard autoloader first. Same thing happens. The issue is in the
autoloading process, not spl_autoload() itself.

Fatal error: Uncaught ParseError: syntax error, unexpected end of file, expecting function
(T_FUNCTION) in /root/php/PHP-7.0.17/widget.php:4
Stack trace:
#0 [internal function]: spl_autoload('Widget')
#1 /root/php/PHP-7.0.17/bug.php(15): spl_autoload_call('Widget')
#2 {main}

Next Exception: Could not autoload the class definition for "Widget" in
/root/php/PHP-7.0.17/bug.php:10
Stack trace:
#0 [internal function]: AutoLoadFallback('Widget')
#1 /root/php/PHP-7.0.16/bug.php(15): spl_autoload_call('Widget')
#2 {main}
  thrown in /root/php/PHP-7.0.17/bug.php on line 10


Bundling the exceptions is a bit unusual for PHP - normally it would be one error at a time - but I
don't think there's any harm in it being there. An exception still gets thrown if one
occurs, with the difference being that autoloading continues and therefore the class could still be
loaded before the exception goes up the call stack.
https://3v4l.org/IlUiA

------------------------------------------------------------------------
[2017-04-04 23:12:19] lightnb at bellsouth dot net

It seems like PHP should differentiate between a user-thrown exception and a parse error in a found
file. (Although I'm still not sure what use-case would require autoload execution to continue
after an exception is thrown, especially an exception throw by PHP's built-in autoloader.)

------------------------------------------------------------------------
[2017-04-04 21:33:15] nikic@php.net

@requinix: I'd consider that a bug. If the first autoloader throws, the second one should not
be executed. But ... it looks like this behavior was intentionally introduced some nine years ago:
https://github.com/php/php-src/commit/e4869828a7905af350afe1870c64651578497a6c
At this point this bug has probably become a "feature" :/

------------------------------------------------------------------------


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=74372


--
Edit this bug report at https://bugs.php.net/bug.php?id=74372&edit=1


Thread (9 messages)

« previous php.bugs (#212984) next »