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建站篡改攻击?


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