在php中,路径如何相对于代码所在的文件而不是执行它的文件


In php, how can a path be relative to the file the code is in rather than the file executing it?

我有一些文件的代码是php和html:

文件(服务器根目录)/folder/folder/test.php

<?php
$im = file_get_contents("im.txt");
?>

文件(服务器根目录)/folder/folder/im.txt

88-88-88

我在服务器根目录上尝试文件index.php

<?php
include "folder/folder/test.php";
?>

当我包含另一个变量时,会丢失,因为im.txt不在服务器根目录上,而是在/folder/folder/im.txt 上

我还在服务器根目录上尝试这个文件index.php

<?php
echo file_get_contents("folder/folder/test.txt");
?>

但不起作用。

我认为在文件包含之前执行文件是个好主意,所以index.php上不会有php,只显示另一个文件的数据,即im.txt 的数据

那我该怎么办?

您可以通过基于当前脚本文件夹指定完整路径来解决相对路径问题。

例如,在folder/folder/test.php中,您可以执行以下操作:

<?php
    echo file_get_contents(__DIR__ . "/im.txt");
?>

当直接调用test.php时,它应该具有与file_get_contents("im.txt")相同的效果,但这一次,无论您从哪个相对路径调用它,它都会起作用。

根据我对您的情况的了解,您想知道包含文件将如何处理变量,例如目录是从包含文件的目录链接还是从父文件的目录连接。当包含一个文件时,该文件中的代码将被写入父文件,就像它一开始就在那里一样。例如:

父文件:

<?php
  $a = 1;
  include "child.php";
  echo $a+$b; //will display "3"
?>

和child.php:

<?php
  $b = 2;
?>

因此,如果主文件位于站点的根目录(example.com/index.php)index.php有这样的:

<?php
  $a = 1;
  include "sub-dir/child.php";
?>

child.php有这个:

<?php
  $b = 2;
  include "other-child.php";
?>

other-child.php应该在根目录中,而不是在"sub-dir"中。

您需要了解的主要内容是,当将一个文件包含到另一个文件中时,相对路径仅相对于主文件,而不是相对于每个包含的文件。

解决方案非常简单-定义

// /var/www/test.php
define("UPLOAD_PATH", "lib/folder/");
include "lib/test.php";

// /var/www/lib/test.php
$filePath = UPLOAD_PATH . 'file.txt';
file_get_contents($filePath);

这应该足以满足你的需要。

好的,我添加另一个答案来帮助您进行修订。我想指出的是,你的问题是向后解释。您应该从主文件(index.php)开始。为了更清楚起见,我将用这种方式进行解释。

服务器根目录下的index.php文件如下:

<?php
include "folder/folder/test.php";
?>

因此,我们可以继续使用"test.php"的内容替换include,然后从那里开始工作。这意味着index.php现在看起来是这样的:

<?php
  $im = file_get_contents("im.txt");
?>

我几乎可以肯定,这就是你迷失的地方。服务器根目录下的文件现在正在运行上面的代码。Witch的意思是它在寻找(server-root)/im.txt。但你已经说过它在(server-rroot)/folder/folder/im.txt中找到。所以,将"test.php"中的那一行更改为该目录,如下所示:$im = file_get_contents("folder/folder/im.txt");

现在,index.php将拉入test.php的代码,然后在适当的文件夹中查找"im.txt",此时,index.php看起来如下:

<?php
  $im = '88-88-88';
?>

正如我所说,有很多方法可以处理相对链接,使其更具动态性,以防你想在不同的目录中包含一个文件并更改它的相对内容。如果你想的话,你甚至可以使它相对于"test.php"。研究php的神奇常数DIRfile和名为getcwd()的函数,这些应该可以帮助你做更高级的事情。目前,您可以通过手动调整目录来修复它。

进一步阅读:

http://yagudaev.com/posts/resolving-php-relative-path-problem/

获取当前脚本文件名

为了在php脚本中内联评估/执行php脚本,可以使用eval()函数。以下是一些更详细的解释:http://php.net/manual/en/function.eval.php