Skip to content

Regression: include/require(+_once) expression returns NULL — Zend returns 1 or file return (re-#4483, Zend/zend_execute.c) #21938

Description

@PurHur

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

  • Successful include/require/include_once/require_once with no file return yield 1 (truthy int) as expression values on VM
  • File return $x is the expression value of require/include (once variants on first load)
  • Compliance .phpt covering empty success + explicit return
  • php-src-strict; no php-compiler-strict shortcut

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:vmVirtual machinebugSomething isn't workingimplementation-readySpec complete: repro, php-src ref, done-when — safe for workers to claimphase-2:languagePhase 2 – language features

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions