php手册告诉我们,require和include只是在对错误信息的处理上有所差别。可是自己记性不好,经常忘记,所以今天就把php内核源码认真的查看了一下,具体的过程记录在这里了:
关键是在zend_language_scanner.l文件中的这段代码:
// require与include的差别只是在此:错误信息的显示级别
if (type==ZEND_REQUIRE) { //require时
zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename TSRMLS_CC);
zend_bailout();
} else {
zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename TSRMLS_CC);
}
而zend_message_dispatcher调用的其实是main/main.c文件中的php_message_handler_for_zend函数,里面有:
显然,include使用E_WARNING级别来显示错误信息,而require使用E_COMPILE_ERROR基本来显示错误信息。