PHP:当我从另一个包含文件的目录中包含文件时,为什么会出现这种奇怪的行为?

Mos*_*oss 1 php nested path include

我从未见过这样的事情.

文件结构:

  • somefolder/base.php
  • 包括/ stuff.php
  • 包括/ constants.php

base.php:

<?php require("../includes/stuff.php"); ?>
Run Code Online (Sandbox Code Playgroud)

stuff.php:

<?php 
   require("constants.php"); 
   echo "Welcome to stuff.php";
?>
Run Code Online (Sandbox Code Playgroud)

constants.php:

<?php echo "IMPORTANT CONSTANTS DEFINED HERE!";  ?>
Run Code Online (Sandbox Code Playgroud)

结果:

欢迎来到stuff.php

为什么不显示constant.php消息?!我会告诉你什么不是问题:它不是php代码.

我从一些复杂的文件开始,其中常量文件实际上是DEFINE() - 一些常量,并且由于某种原因,只有前几个常量正在工作.我最终禁用了所有无关的代码,包括DEFINE()和只有echo语句,这个问题仍然一直盯着我.顺便说一下,无论代码的顺序如何,一些定义的常量如何通过而不是任何回声?

所以我终于意识到这是荒谬的,并决定创建一些新文件作为测试.那些工作.或者也许他们没有,我忘了.无论如何,通过创建新文件并尝试移动它们并将代码从一个文件复制到另一个文件,我已经取得了一定程度的成功,但似乎没有任何押韵或理由.

哇,这只是在:我得到了constants.php文件在不同的名称下工作,但当我将其更改为constants.php时,它停止工作!我尝试在不同的浏览器中清除缓存/打开并重新启动服务器,但没有一个有用.我觉得我或我的电脑都是毒品.Gaaaahh!


编辑

啊哈.我遗漏了一条非常重要的信息.我没有提到的一个文件.

  • somefolder/constants.php

包含该文件而不是includes/constants.php.这就是我没有丢失文件错误的原因.这完全令人困惑!我期望sub-includes在更高级别包含之前发生所以stuff.php会在它自己的目录中查找constants.php,但我猜base.php包含stuff.php和THEN base.php执行stuff.php中指定的include这意味着include是相对于base.php.所以绝对路径毕竟是解决方案.

附加编辑:

很有意思.当我简单地改变include/constants.php(例如constanza.php)的名字时,我仍然感到困惑.看起来文件包含不是那么剪切和干燥.如果有两个具有相同名称的文件,则它将优先选择相对于执行包含的父文件的文件.但是,如果没有选择它会相对于孩子做得很好.

Pas*_*TIN 6

包含中使用的路径与包含的文件无关:它们相对于include_path.

这意味着使用包含/需要的相对路径通常不会达到您的预期...


通常使用的解决方案是使用绝对路径 ; 通过这种方式,您可以确定包含哪些内容.

当然,在代码中使用绝对路径是不好的(当您的应用程序部署到另一个路径时,它将在一台服务器上运行,但不能在另一台服务器上运行) ; 所以,解决方案是:

  • 获取您所在文件的绝对路径
  • 除了另一个文件的相对路径之外,还要使用它来包含该文件.


您可以通过以下方式获取您所在文件的完整路径__FILE__.

这意味着该目录为当前文件(该指令被写入到文件中)可以与获得dirname(__FILE__).

在那之后,只需要编写正确的路径.
例如,stuff.php你在使用:

require(dirname(__FILE__) . "/constants.php"); 
Run Code Online (Sandbox Code Playgroud)

而在base.php,你使用:

require(dirname(__FILE__) . "/../includes/stuff.php");
Run Code Online (Sandbox Code Playgroud)

  • 对不起。你是对的。我没有尝试仅在base.php上的所有内容都使用绝对路径。请参阅我对原始问题的编辑说明。我想我需要休息一晚才能理解这一点。顺便说一下,对于PHP 5.3.0,`__DIR__`是完成您建议的最简单的方法。 (2认同)