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

时间:2010-06-23 06:26:23

标签: php include nested path

我从未见过这样的事情。

文件结构:

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

base.php:

<?php require("../includes/stuff.php"); ?>

stuff.php:

<?php 
   require("constants.php"); 
   echo "Welcome to stuff.php";
?>

constants.php:

<?php echo "IMPORTANT CONSTANTS DEFINED HERE!";  ?>

结果:

  

欢迎来到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)的名字时,我仍然感到困惑。看起来文件包含不是那么剪切和干燥。如果有两个具有相同名称的文件,则它将优先选择相对于执行包含的父文件的文件。但是,如果它没有选择,它会相对于孩子做得很好。

1 个答案:

答案 0 :(得分:0)

我发现有用的东西是检查getcwd()(获取当前工作目录),它将返回包含它的文件的文件夹路径。如果在我的顶级目录下面(下一级)调用了包含文件,那么我可以计算并预先添加适当数量的../

即如果我知道我的包含文件位于topfolder/css/blah.css,那么我可以在我的包含文件中查看getcwd()的值,如下所示:

$leaveDirectoryIfNecessary = "";
// Grab the last 9 characters of the directory name
if (substr(getcwd(), -9) != "topfolder") {
    $leaveDirectoryIfNecessary = "../";
}

然后我会在我在include文件中引用的每个文件之前echo $leaveDirectoryIfNecessary,如下所示:

<link rel="stylesheet" type="text/css" href="<?php echo $leaveDirectoryIfNecessary; ?>css/goodstuff.css">

值得注意的是,这假设您不会在子文件夹树中的任何位置复制父/顶级文件夹的名称。

如果你碰巧有一个更深层次的文件夹结构,那么你还需要有一些循环并在'topfolder'之后计算当前工作目录中的正斜杠数。