V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lesloli
V2EX  ›  PHP

关于 PHP 的 include 的问题

  •  
  •   lesloli · 2017-04-03 00:20:48 +08:00 · 3441 次点击
    这是一个创建于 2818 天前的主题,其中的信息可能已经有所发展或是发生改变。

    新人第一次问,请各位见谅 在 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 请问该如何解决。

    15 条回复    2017-04-22 16:11:51 +08:00
    Tyanboot
        1
    Tyanboot  
       2017-04-03 00:37:57 +08:00 via Android
    include 的时候用__DIR__

    比如

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

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

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

    include __DIR__ . "/../a.php";
    cxbig
        14
    cxbig  
       2017-04-03 16:47:34 +08:00 via iPhone
    没有 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
        15
    mingyun  
       2017-04-22 16:11:51 +08:00
    使用 autoload 延迟加载,使用的时候才 require 文件
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2750 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:03 · PVG 08:03 · LAX 16:03 · JFK 19:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.