文件包括混淆和错误

时间:2018-06-12 09:57:58

标签: php require

我有以下目录结构。

public_html
    |----------app1
    |            |---------config.php
    |            |---------index.php 
    |
    |----------app2
                 |---------import.php

APP1 / config.php中

define('ABC', 'hello');

APP1 / index.php的

require_once 'config.php';
echo ABC;

调用app1/index.php打印:

  

您好

APP2 / import.php

require_once('../app1/index.php');

调用app2/import.php打印:

  

注意:使用未定义的常量ABC - 假设' ABC'在第10行的/abs/path/public_html/app1/index.php中(行回显ABC)

     

ABC

为什么会这样?

如何使其正常运作?

3 个答案:

答案 0 :(得分:2)

您应该阅读documentation about include and require。相对路径始终相对于第一个调用脚本进行解析。

因此,当您致电app1/index.php时,require_once('config.php')会加载app1/index.php,但当您致电app2/import.php时,require_once('config.php') 会尝试加载不存在的 app2/config.php

建议1 :在编码时提高你error reporting level,你会得到更多关于错误的线索。在这种情况下,include至少通知一次。

建议2 :如果没有充分理由,请避免使用include,使用require_once,如果无法加载文件,则会出现致命错误。

答案 1 :(得分:2)

使用

require_once __DIR__ . '/config.php';

而不是require_once 'config.php';

参考:PHP file paths and magic constants

答案 2 :(得分:1)

问题是您从文件夹php app2/import.php运行脚本public_html而不是public_html/app2
如果你这样做:

cd app2 && php import.php

一切都会奏效!

require_once 'config.php';app1/index.php的示例有效,因为文件index.phpconfig.php位于同一目录中。
app2/import.php放在app1/config.php的另一个目录中,因此在这种情况下你不能使用这种方法。

有目的地避免使用相对路径的混乱,你必须在__DIR__的路径中使用常量import.php,如下所示:

<?php
require_once(__DIR__ . '/../app1/index.php');

现在您可以从public_html目录运行此脚本。