PHP 中使用 require 包含文件时的路径问题详解

发布时间 - 2026-01-10 00:00:00    点击率:

本文讲解如何在 php 中正确使用 `require` 包含相对路径文件,重点解决因工作目录与脚本位置不一致导致的 “failed to open stream” 错误,并提供基于 `__dir__` 和 `dirname()` 的可靠路径构造方案。

在 PHP 开发中,require(或 include)语句的路径解析依赖于当前工作目录(current working directory),而非被包含文件(如 item_page.php)所在的物理目录。这是许多开发者踩坑的根本原因——尤其在使用轻量级本地服务器(如 VS Code 的 Five Server 扩展)时,其启动方式往往以项目根目录为工作目录,而非脚本所在目录。

从你的错误日志可明确看到:

PHP Warning: require(../nav_bar/nav_bar.php): Failed to open stream...
in C:\Users\holli\OneDrive\Dokumente\onlineshop\source\main\item_page\item_page.php on line 8

说明 PHP 尝试从当前工作目录向上一级找 nav_bar/ 文件夹,但实际结构中 nav_bar 与 item_page 是同级子目录(均位于 source/main/ 下),因此 ../nav_bar/ 实际指向的是 source/ 目录,自然找不到。

你尝试过的绝对路径(如 C:\...\nav_bar.php)也失败,是因为 Windows 路径中的反斜杠 \ 在 PHP 字符串中需转义(应写为 \\ 或使用正斜杠 /),且硬编码绝对路径严重破坏项目可移植性,绝不推荐用于生产环境

✅ 正确解法:始终基于脚本自身位置构建路径
PHP 提供了魔术常量 __DIR__(返回当前文件所在目录的绝对路径),配合 dirname() 可安全向上跳转。根据你的目录结构:

onlineshop/
└── source/
    └── main/
        ├── item_page/
        │   └── item_page.php   ← 当前执行脚本
        └── nav_bar/
            └── nav_bar.php     ← 目标文件

item_page.php 与 nav_bar.php 的共同父目录是 source/main/,因此应先跳到 main/,再进入 nav_bar/:

// ✅ 推荐写法:清晰、跨平台、可移植
require __DIR__ . '/../nav_bar/nav_bar.php';

⚠️ 注意:__DIR__ 返回的是 item_page.php 所在目录(即 .../source/main/item_page),../nav_bar/ 即相对于该目录向上一层进入 main/,再进入 nav_bar/ —— 完全匹配实际路径。

其他等效写法(按推荐度排序):

// 方案2:显式用 dirname() 向上两级(更易读)
require dirname(__DIR__) . '/nav_bar/nav_bar.php';

// 方案3:若未来结构调整,可封装为常量(推荐大型项目)
define('ROOT_DIR', dirname(dirname(__DIR__)));
require ROOT_DIR . '/main/nav_bar/nav_bar.php';

? 额外建议:

  • 避免使用 require "source\main\nav_bar\nav_bar.php" 这类相对路径:它依赖工作目录,而 Five Server 等工具的工作目录不可控;
  • 开发时可用 echo __DIR__; die(); 快速验证当前脚本路径;
  • 生产环境建议统一入口(如 index.php),通过自动加载器(PSR-4)管理依赖,而非手动 require。

掌握 __DIR__ + 相对路径的组合,就能彻底告别 “No such file or directory” 错误——路径从此不再靠猜,而是由代码精确控制。


# php  # windows  # 编码  # 工具  # ai  # win  # stream  # vs code  # echo  # 常量  # 魔术常量  # include  # require  # die  # Directory  # 字符串  # 的是  # 而非  # 这是  # 是因为  # 就能  # 是由  # 找不到  # 这类  # 跳转  # 相对于 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何处理表单验证?(Requests代码示例)  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Laravel如何集成Inertia.js与Vue/React?(安装配置)  Python文本处理实践_日志清洗解析【指导】  如何用搬瓦工VPS快速搭建个人网站?  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  如何在阿里云购买域名并搭建网站?  Linux系统命令中tree命令详解  南京网站制作费用,南京远驱官方网站?  微信小程序 五星评分(包括半颗星评分)实例代码  IOS倒计时设置UIButton标题title的抖动问题  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  浅析上传头像示例及其注意事项  独立制作一个网站多少钱,建立网站需要花多少钱?  如何快速查询域名建站关键信息?  JavaScript如何实现类型判断_typeof和instanceof有什么区别  如何用花生壳三步快速搭建专属网站?  如何在建站主机中优化服务器配置?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  想要更高端的建设网站,这些原则一定要坚持!  装修招标网站设计制作流程,装修招标流程?  iOS验证手机号的正则表达式  nodejs redis 发布订阅机制封装实现方法及实例代码  如何在万网利用已有域名快速建站?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  什么是javascript作用域_全局和局部作用域有什么区别?  如何挑选优质建站一级代理提升网站排名?  如何在IIS中配置站点IP、端口及主机头?  Laravel如何创建自定义中间件?(Middleware代码示例)  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  Laravel distinct去重查询_Laravel Eloquent去重方法  如何打造高效商业网站?建站目的决定转化率  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  香港服务器如何优化才能显著提升网站加载速度?  如何在万网开始建站?分步指南解析  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  java ZXing生成二维码及条码实例分享  Laravel Session怎么存储_Laravel Session驱动配置详解  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  JavaScript Ajax实现异步通信  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  高防服务器租用指南:配置选择与快速部署攻略  如何有效防御Web建站篡改攻击?