require本身不返回值,但可通过在被引入文件末尾使用return语句实现数据传递;$config = require 'config.php';可行的前提是config.php末尾有return语句,否则返回NULL或上一条表达式的值。

require 本身不支持 return 语句返回值
PHP 的 require 是语言结构,不是函数,它只负责载入并执行文件,**不会返回任何值**(哪怕被引入的文件里写了 return)。你不能写 $data = require 'config.php'; 并指望它拿到返回值——这行代码会报错或静默失败(取决于上下文),因为 require 没有返回值可赋值。
想让引入文件“返回数据”,必须用 return + require 的组合模式
常见做法是在被引入的 PHP 文件末尾加 return(通常是数组、字符串或对象),然后用 require 执行它——此时 require 虽然自身无返回值,但 PHP 允许在 require 表达式所在作用域中“捕获”被引入文件的 return 值。这是 PHP 特有的行为,本质是“执行并取其最后一行表达式的值”。
- 被引入文件(如
config.php)末尾必须有return语句,例如:<?php return [ 'host' => 'localhost', 'port' => 3306 ]; - 主文件中这样用:
$config = require 'config.php'; // ✅ 可行,$config 得到数组
- 如果
config.php没有return,或者return写在中间(后面还有代码),$config会是NULL或上一条表达式的值,极易出错 - 注意:这种写法只适用于
require和include,不适用于require_once/include_once在某些旧版本 PHP 中可能不一致(建议统一用require)
require 和 include 在 return 场景下的关键区别
两者都能“接收”被引入文件的 return 值,但错误处理逻辑不同:
-
require:文件不存在或语法错误 → 致命错误(Fatal error),脚本立即终止 -
include:同上情况 → 警告(Warning),脚本继续执行,但include表达式返回FALSE,后续赋值会得到FALSE而非预期数据 - 所以生产环境读配置、路由等关键数据,优先用
require;动态加载可选模板时,include更灵活 - PHP 8.0+ 对
include返回FALSE后再return的行为更严格,容易触发类型警告,务必检查返回值是否为预期类型
容易被忽略的坑:路径、作用域和缓存
这个模式看着简单,实际踩坑多在细节:
立即学习“PHP免费学习笔记(深入)”;
- 路径是相对于当前执行脚本(不是被引入文件)的,
require 'config.php'不会自动从__DIR__查找,建议显式写全:require __DIR__ . '/config.php'; - 被引入文件里的变量不会自动导入当前作用域——只有
return的值被接收,其他变量(如$tmp = 123;)在引入后不可见 - OPcache 默认会缓存
require的文件内容,改了config.php但没清缓存?值还是旧的。开发时可临时关 OPcache,或确保配置文件不被缓存(如加时间戳参数不适用,因是 PHP 执行而非 URL) - 不要在被引入文件里写
exit或die,否则后续逻辑直接中断,且无法捕获返回值
return,或者写了但前面有输出(空格、BOM、echo),导致 headers already sent 或返回值为 NULL。盯住最后一行,确保它是干净的 return 表达式。



















