PHP关于require_once路径问题的详解
我的站点目录如下:
**************************************************************
wwwroot //网站根目录 绝对路径为: F:/wwwroot
-- folder_a // 文件夹A
file_a_a.php file_a_b.php file_a_c.php
-- folder_b // 文件夹B
file_b_a.php file_b_b.php file_b_c.php
-- index.php
*************************************************************
这个目录层次已经很清楚了:
wwwroot为根目录,下面有index.php文件和folder_a,folder_b两个文件夹
这两个文件夹分别有3个php文件
先来看index.php文件的内容:
<?php require_once("folder_a/file_a_a.php"); echo "文件folder_a_a.php被包含成功"; ?>
再来看folder_a/folder_a_a.php文件的内容:
<?php require_once("../folder_b/file_b_a.php"); $x = new X(); $x.printInfo(); ?>
最后再来看看folder_b/folder_b_a.php文件的内容:
<?php class X{ function printInfo(){ echo 'success; } } ?>
ok 如果我现在直接运行 floder_a/file_a_a.php
那么会输出: success
如果我运行 wwwroot下的index.php
那么会报错,原因是找不到包含文件:file_b_a.php
但是如果我在所有的require_once()中加入 dirname(FILE).'/'
那么无论运行 file_a_a.php 还是 index.php 都可以正常输出
*********************************************************
问题:
我第一次使用的是相对路径,所以重复包含的时候就出错了
而我第二次使用的是绝对路径,所以不出错.可是我还是有点疑惑:
我先分析了以下使用相对路径会出错的原因:
我运行index.php,它能找到 folder_a目录,也能找到该目录下的file_a_a.php,于是它就把 folder_a/file_a_a.php 里的内容复制到了index.php 的第一行(包含语句的那行),然后再继续运行(也就是运行包含过来的内容),因此此时等于是在index.php中运行 file_a_a.php 中的require_once('../folder_b/file_b_a.php'); 它根据当前index.php的位置去找这个路径文件(file_b_a.php),当然找不到啦,所以它出错了.
可是我使用绝对路径的时候不是一样的道理吗?可为什么它就不出错?可能这句话大家有点不解了,我来详细说明(根据程序的运行顺序来说明).
程序先运行 index.php(注意此时我加上了 dirname(FILE),所以当前是绝对路径),
index.php先运行第一句代码:require_once(dirname(FILE).'/'.'folder_a/file_a_a.php');
dirname(FILE) 就是 f:/wwwroot/ 所以这句代码包含的路径也就是:
f:/wwwroot/folder_a/file_a_a.php
这个路径是正确的,因此没问题是吧
ok 第一步正确完成
然后它就把 file_a_a.php 中的代码复制到的 index.php 的这个地方:
然后仍然继续运行: 这是也就是在index.php 中运行file_a_a.php 中的所有代码,那么我们来看看它运行那些代码?
<?php require_once(dirname(FILE).'/'."../folder_b/file_b_a.php"); $x = new X(); $x.printInfo(); ?>
对就是这些,需要注意的是,这些代码已经被复制到了index.php,也就是说,现在index.php的内容实际上就变成了:
<?php require_once(dirname(FILE).'/'."../folder_b/file_b_a.php"); $x = new X(); $x.printInfo(); echo "文件folder_a_a.php被包含成功"; ?>
那么仍然按程序的执行顺序来分析以上代码:
dirname(FILE) 应该是 f:/wwwroot (因为现在这些代码在index.php中执行,和相对路径一样的道理,因此得到的是index.php所在的目录)
那么包含的路径应该就是: f:/wwwroot/../folder_b/file_b_a.php
那么我们检查下这个路径是否有file_b_a.php文件呢? 答案是没有,因为 f:/wwwroot/../folder_b 已经返回到的f:盘符下的folder_b目录,而这个目录并不存在.
但是执行的结果却让我不解,它竟然正确输出了.
也许大家会说:在相对路径中,index.php 先包含了 file_a_a.php 然后再执行包含 file_b_a.php 的代码,所以找不到目录.而使用绝对路径后,index.php 在包含 file_a_a.php 之前,file_a_a.php 已经先执行了包含 file_b_a.php 的代码,所以正确输出.但是请注意:php文档中以及许多文档教程都是这样说明的:包含一个文件,实际上就是将被包含的文件中的代码复制到包含命令的地方,就算这个观点是错误的,那么同样是 require_once 命令,不可能对相对路径就是先包含再执行,而对绝对路径却是先执行再包含吧.
不解,请大家指教.(非常感谢大家能看到这里,问题很长,是因为我郁闷的时间更长,所以请大家不要 Ctrl+C Ctrl+V,也不要说:看 API 或 自己找资历 等等了.)谢谢.
不要想得太复杂...
用绝对路径:
你的c:\a.php
可以引用
d:\b.php
你理解错的一点就是 FILE永远指向当前文件,无论是主执行文件,还是被包含文件
也就是说: 如果是使用相对路径 ../folder_b/file_b_a.php 那么会先复制过来,然后在指向地址,如果使用FILE,就会先指向,然后再被包含,是这样吗?
如果用的是虚拟目录 那这个目录就会以你当前运行的文件为基准
也就是
folder_a/folder_a_a.php文件的内容这样写:
<?php require_once("folder_b/file_b_a.php"); $x = new X(); $x.printInfo(); ?>
你看下会不会错
在跟目录里建个文件,把要引用的文件全部按绝对路经引进来;其他目录引这个文件就好了.
以上是PHP关于require_once路径问题的详解的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

如果您是一位经验丰富的 PHP 开发人员,您可能会感觉您已经在那里并且已经完成了。您已经开发了大量的应用程序,调试了数百万行代码,并调整了一堆脚本来实现操作

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

PHP的魔法方法有哪些?PHP的魔法方法包括:1.\_\_construct,用于初始化对象;2.\_\_destruct,用于清理资源;3.\_\_call,处理不存在的方法调用;4.\_\_get,实现动态属性访问;5.\_\_set,实现动态属性设置。这些方法在特定情况下自动调用,提升代码的灵活性和效率。
