lesloli
V2EX  ›  PHP

关于 PHP 的 include 的问题

  •  
  •   lesloli · Apr 3, 2017 · 4551 views
    This topic created in 3503 days ago, the information mentioned may be changed or developed.

    新人第一次问,请各位见谅 在 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 replies  •  2017-04-22 16:11:51 +08:00
    Tyanboot
    Tyanboot
    Apr 3, 2017 via Android
    1
    include 的时候用__DIR__

    比如

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

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

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

    include __DIR__ . "/../a.php";
    cxbig
    cxbig
    Apr 3, 2017 via iPhone
    14
    没有 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
    mingyun
    Apr 22, 2017
    15
    使用 autoload 延迟加载,使用的时候才 require 文件
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5203 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 06:24 · PVG 14:24 · LAX 22:24 · JFK 01:24
    ♥ Do have faith in what you're doing.