Category
language · php-src-strict · include/require return semantics
Problem
#4483 claimed include/require return parity, but expression forms still return NULL on VM when Zend returns int(1) (successful include with no return) or the file's return value.
Verified 2026-07-21 (Docker php 8.2.32 vs bin/vm.php):
| Repro |
Zend 8.2 |
VM |
var_export(require_once $emptyPhpFile) (<?php only) |
1 |
NULL |
var_export(include_once $emptyPhpFile) |
1 |
NULL |
var_export(include $emptyPhpFile) |
1 |
NULL |
var_export(require $fileReturning7) (<?php return 7;) |
7 |
NULL |
This breaks common $config = require 'config.php'; patterns and self-host/bootstrap scripts that use include-as-expression.
php-src reference
PHP implementation target
Repro
./script/docker-exec.sh -- bash -lc 'cat > /tmp/req_ret.php <<'"'"'PHP'"'"'
<?php
file_put_contents("/tmp/empty_req.php", "<?php\n");
file_put_contents("/tmp/ret7.php", "<?php return 7;\n");
echo "empty="; var_export(require_once "/tmp/empty_req.php"); echo "\n";
echo "ret7="; var_export(require "/tmp/ret7.php"); echo "\n";
PHP
php /tmp/req_ret.php; php bin/vm.php /tmp/req_ret.php'
Done when
Category
language· php-src-strict · include/require return semanticsProblem
#4483 claimed include/require return parity, but expression forms still return
NULLon VM when Zend returnsint(1)(successful include with noreturn) or the file'sreturnvalue.Verified 2026-07-21 (Docker
php8.2.32 vsbin/vm.php):var_export(require_once $emptyPhpFile)(<?phponly)1NULLvar_export(include_once $emptyPhpFile)1NULLvar_export(include $emptyPhpFile)1NULLvar_export(require $fileReturning7)(<?php return 7;)7NULLThis breaks common
$config = require 'config.php';patterns and self-host/bootstrap scripts that use include-as-expression.php-src reference
Zend/zend_execute.c—ZEND_INCLUDE_OR_EVALreturn value (1on success when included file does notreturn)Zend/zend_execute_API.c— compile/execute inclusion entrypointsPHP implementation target
lib/VM.php/ include helpers) — propagate included-frame return; default success to1notnullRepro
Done when
include/require/include_once/require_oncewith no filereturnyield1(truthy int) as expression values on VMreturn $xis the expression value ofrequire/include(once variants on first load).phptcovering empty success + explicit return