【问题标题】:Including files by relative path按相对路径包含文件
【发布时间】:2011-12-08 12:17:11
【问题描述】:

关于链接文件一定有一些我不明白的地方——但这是我的问题。

基本上,我有三个文件。

  1. generalfunctions.php
  2. wordcount.php
  3. index.php

这三个文件都在不同的目录中。

B 依赖于 A 如下:../../../phpfunctions/generalfucntions.php
当我运行 B 时,一切都很好。

但是 C 依赖于 B 如下:../wordcount.php

当我运行 C 时,我收到一条错误消息,提示找不到链接文件 A。

实际错误是:

第 11 行的 /.../public_html/plaoul/text/statistics/wordcount.php 中没有这样的文件或目录

任何想法我做错了什么??

感谢您的帮助。

【问题讨论】:

  • @Sinthia public_html/plaoul/text/statistics/wordcount.php
  • 感谢您提出的好问题。如果明确提及站点/文件结构,可能会更容易理解。

标签: php path include


【解决方案1】:

尝试使用绝对值来代替

include("/public_html/phpfunctions/generalfunctions.php");

【讨论】:

  • 嗯我不确定你的意思:我正在尝试这个:include(dirname("/public_html/phpfunctions/generalfunctions.php")); 但它不起作用。
  • @Jeff:你插入这个包含代码的文件有什么路径?
  • 你需要使用dirname(__FILE__)——常量__FILE__包含它所属的文件名
  • @genesis public_html/plaoul/text/statistics/wordcount.php
  • @genesis:我刚刚解释了你的意思
【解决方案2】:

我将采用数学方法。 PHP 总是包含来自当前工作目录的附加文件,而不是当前被包含的文件。

因此,如果我们在文件 C (index.php) 中,我们处于第 4 级。文件 C 包括位于父目录中的文件 B(根据 ../),它将在第 3 级。

现在文件 B 包含在 inside 文件 C 中(特别强调内部)。我们仍在从第 4 级开始工作,而不是第 3 级。因此,当您尝试包含文件 A 时,从技术上讲,我们将文件 A 包含在文件 C 中,而不是文件 B 中,因此路径只会向上 3 个目录而不是 4它需要通过的目录。

因此当我们执行文件 B 时,它位于第 3 级,包含文件 A 将上升 3 级到第 0 级,这是查找文件的适当位置。

我建议使用绝对路径来访问所有文件,因为使用相对路径只会导致问题,例如您在这里发现的问题。

我这样做的方式是设置一个“根”变量,该变量可在我的所有脚本中访问,用于定义绝对路径。我把它放在我的 index.php 文件中,因为这是唯一运行过的文件。

$ani->i->root = dirname(str_replace("\\", "/",  __FILE__));
// Where my $ani variable is accessible everywhere.

这样,每当我需要包含/需要文件时,我都可以简单地执行include "{$ani->i->root}/modules/somemodule.php" 之类的操作,而不必担心路径等问题。

【讨论】:

  • 在您将应用程序移动到新位置之前,这很好!相对路径用于使应用程序可移植到不同的位置或具有不同目录结构的不同系统。
  • 就我个人而言,我使用单个目录来包含和自动加载器,但我认为他不会对此持开放态度。
  • @Sinthia 如果将应用程序移动到新位置,则会更改“配置”文件中的一行。如果可以避免 include('../../ ../blah.php') 丑陋
【解决方案3】:

在 php 中使用 include() 发生的事情是文件中的函数被包含的文件替换。您用 ../wordcount.php 说该文件可以在当前工作目录的父目录中找到。如果你得到文件 B 的正确路径,php 会将文件 b 中的函数替换为文件 a 的内容,然后将文件 C 中的包含函数替换为文件 A(在包含之后)。

编辑:哎呀,我错了。

【讨论】:

  • 不是说找不到wordcount.php,而是说找不到wordcount.php第11行指定的文件,所以该文件已经被包含并正在执行。
  • 好的,所以找不到A,同样的解决方案。这仍然是一个路径错误。向上移动直到找到共同的父级,然后向下移动,从当前文件所在的目录开始。
【解决方案4】:

当您使用include 包含文件,并且您使用相对路径作为参数时,它将相对于当前工作路径

当前路径是什么?它通常是第一个调用 PHP 脚本的路径。整个执行开始的脚本。您可以使用函数getcwd 获取当前工作目录。例如:<?php echo getcwd(); ?> 将显示当前工作路径。您可以使用chdir 函数更改当前工作路径。例如:<?php chdir( '/home/myself' ); ?> - 使用这个命令你只是改变了当前的工作路径!

因此,在 include 中使用相对路径并不总是好的,因为当前路径可能会改变。

但是使用__FILE__ ma​​gic constant,您可以使用一种相对路径作为包含的参数,使其相对于包含命令所在的文件。这很好!因为无论当前工作路径是什么,包含将始终相对于包含的文件!

所以...尝试以下操作:

在 B 中,您应该包括 A,如下所示:

include( dirname( __FILE__ ) . '/../../../phpfunctions/generalfunctions.php' );

在 C 中你应该包括 B 如下:

include( dirname( __FILE__ ) . '/../wordcount.php' );

简而言之:使用dirname( __FILE__ ),您可以使用相对于“include”命令所在文件的路径来包含文件。否则,路径将相对于当前工作路径。

【讨论】:

  • 我不确定我是否理解___FILE___ -- 我实际上不应该正确__File__ 我是吗?
  • @Jeff:是__FILE__,而不是___FILE___。是的,你实际上应该写__FILE__(前后两个下划线,大写字母):php.net/manual/en/language.constants.predefined.php
  • 从 PHP 5.3.0 起,您可以使用 __DIR__ 而不必编写 dirname(__FILE__)
猜你喜欢
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 2019-04-21
  • 2013-04-09
  • 2012-04-08
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多