require_once generate a WARNING and a FATAL ERROR.
Without your own error handling, you should get something like this:
Warning: require_once(foo) [function.require-once]: failed to open stream: No such file or directory in […]
Fatal error: require_once() [function.require]: Failed opening required 'foo' (include_path='.') […]
Looking at the
errstr of your output you see that you get the “failed to open stream: No such file or directory” part – so the text of the WARNING.
And the description of set_error_handler tells you,
“The following error types cannot be handled with a user defined function: E_ERROR, […]”
So the WARNING is caught as was to be expected – and the FATAL ERROR, in accordance with what the manual says, is not.