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

关于 PHP 的 include 的问题

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

    新人第一次问,请各位见谅 在 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  
    PRO
       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  
    PRO
       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     Solana     2632 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 14:22 PVG 22:22 LAX 07:22 JFK 10:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86