关于 PHP 的 include 的问题

2017 年 4 月 3 日
 lesloli

新人第一次问,请各位见谅 在 www 文件夹下面有两个文件夹 w1 和 w2 还有一个文件 a.php 在 w1 里有 b.php w2 里有 c.php a.php 已经 include'w1/b.php'

现在想让 c.php include a.php 但是 c.php include'../a.php'的时候会提示找不到 b.php 请问该如何解决。

4473 次点击
所在节点    PHP
15 条回复
Tyanboot
2017 年 4 月 3 日
include 的时候用__DIR__

比如

include __DIR__ . "/w1/b.php";

include __DIR__ . "../a.php";
lesloli
2017 年 4 月 3 日
@Tyanboot 我好想理解您的意思,但我的问题是
c.php include a.php 时 也会执行 a.php 里的"include 'b.php' "但是执行的目录并不是 a.php 所在的目录,而是 c.php 所在的目录。
所以会导致去寻找 /w2/w1/b.php 这个文件
atnopc
2017 年 4 月 3 日
include(realpath("./")."w1/b.php");
allblue
2017 年 4 月 3 日
set_include_path()
jfcherng
2017 年 4 月 3 日
@lesloli 我覺得他的回答確實解決你的問題。亦即,所有 include 都使用絕對路徑。
dangyuluo
2017 年 4 月 3 日
用__DIR__的话,基本上可以抹平目录的问题了,也即每个文件只关注被引用文件和自身之间的相对目录关系。
sagaxu
2017 年 4 月 3 日
现代 PHP 都用 autoload 技术了
FYK
2017 年 4 月 3 日
我碰到过,大致是这样 a 包含 b , b 包含 c ,如果用相对定位那么起始是 a ,也就是此时 b 里面的包含路径不能是以 b 为起始,你可以认为是 b 的代码进入了 a ,自然再从原本的包含路径是包含不了 c 的。另外应该同楼上所说的方式,你的方式会造成各种混乱的。大概是这样,有错误请告知。
GoBeyond
2017 年 4 月 3 日
相对路径的锅。。
看过的一个比较好的思路是 在主入口设置一个值为入口点路径的常亮,然后其他 php 文件都以这个常量的值为基准去 include 其他文件。这样就能有效避免 include 时路径乱撞的问题了,简洁明了
GoBeyond
2017 年 4 月 3 日
我上面说的那个例子不仅仅适用于单入口模式,多入口也可以,但最好所有的入口都在顶层父目录里,不然还是会麻烦不断
crispgm
2017 年 4 月 3 日
用 autoload 吧,一直 require/include 会让人崩溃的
weidianlai
2017 年 4 月 3 日
新人来学习
Tyanboot
2017 年 4 月 3 日
@lesloli 没问题的。__DIR__是当前脚本所在目录,并且如果是在被 include 的 php 里面的话,__DIR__的内容是被 include 的 php 的目录,是经过修正的。

不过我 1 楼说的有点问题,__DIR__是不包括结尾的分隔符的,所以应该是

include __DIR__ . "/../a.php";
cxbig
2017 年 4 月 3 日
没有 autoload 或 naming space ,至少做一个 Project Root 的常量也好。
BP - Base Path
DS - Directory Separator

BP . DS . 'a.php'
BP . DS . 'w1' . DS . 'b.php'
BP . DS . 'w2' . DS . 'c.php'
mingyun
2017 年 4 月 22 日
使用 autoload 延迟加载,使用的时候才 require 文件

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/352227

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX