关于 PHP 的 include 的问题

2017-04-03 00:20:48 +08:00
 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 请问该如何解决。

3253 次点击
所在节点    PHP
15 条回复
Tyanboot
2017-04-03 00:37:57 +08:00
include 的时候用__DIR__

比如

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

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

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

include __DIR__ . "/../a.php";
cxbig
2017-04-03 16:47:34 +08:00
没有 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-04-22 16:11:51 +08:00
使用 autoload 延迟加载,使用的时候才 require 文件

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

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

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

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

© 2021 V2EX