如何包含需要绝对路径的PHP文件?

时间:2020-03-05 18:38:14  来源:igfitidea点击:

我有一个类似以下的目录结构;

script.php
  
  inc/include1.php

  inc/include2.php
  
  objects/object1.php

  objects/object2.php
  
  soap/soap.php

现在,我在script.php/ soap / soap.php中都使用了这些对象,我可以移动它们,但是出于特定的原因,我想要这样的目录结构。当执行script.php时,包含路径为inc / include.php,而执行/ soap / soap.php时为../ inc,绝对路径有效,/ mnt / webdev / [项目名] /inc/include1.php ...但是如果我想将目录移动到其他位置,这是一个丑陋的解决方案。

那么,有没有一种使用相对路径的方法,或者以编程方式生成" / mnt / webdev / [项目名称] /"的方法呢?

解决方案

回答

我们可以使用项目根目录的路径定义一个常量,然后将其放在路径的开头。

回答

这应该工作

$root = realpath($_SERVER["DOCUMENT_ROOT"]);

include "$root/inc/include1.php";

编辑:通过aussieviking添加了改进

回答

看看http://au.php.net/reserved.variables

我认为我们要查找的变量是:$ _SERVER [" DOCUMENT_ROOT"]`

回答

我们可以使用相对路径。尝试__FILE__。这是一个PHP常数,总是返回其所在脚本的路径/文件名。因此,在soap.php中,我们可以执行以下操作:

include dirname(__FILE__).'/../inc/include.php';
The full path and filename of the
  file. If used inside an include, the
  name of the included file is returned.
  Since PHP 4.0.2, __FILE__ always
  contains an absolute path with
  symlinks resolved whereas in older
  versions it contained relative path
  under some circumstances.
  (source)

另一种解决方案是在httpd.conf或者.htaccess文件中设置包含路径。

回答

我认为最好的方法是将include放入PHP include路径。有多种方法可以执行此操作,具体取决于设置。

那你可以简单地参考

require_once 'inc1.php';

从任何文件内部访问,而不管它是包含在包含文件中还是位于Web可访问文件中,或者位于任何级别的嵌套子目录中。

这使我们可以将包含文件包含在Web服务器根目录之外,这是最佳实践。

例如

site directory
    html (web root)
        your web-accessible files
    includes
        your include files

另外,请检出__autoload来延迟加载类文件

http://www.google.com/search?q=setting+php+include+path

http://www.google.com/search?q=__自动加载

回答

@Flubba, does this allow me to have folders inside my include directory? flat include directories give me nightmares. as the whole objects directory should be in the inc directory.

哦,是的,绝对如此。因此,例如,我们通常使用单层子文件夹:

require_once('library/string.class.php')

我们需要小心,在真正高流量的站点中过多依赖包含路径,因为php必须先遍历当前目录,然后遍历包含路径中的所有目录,以查看文件是否存在,这可能会减慢速度如果我们受到重击,事情就会变得更糟。

因此,例如,如果我们正在执行MVC,则可以将应用程序目录的路径放置在包含路径中,然后以以下形式指定引用内容

'model/user.class'
'controllers/front.php'

管他呢。

但是总的来说,它只允许我们在PHP中使用真正的短路径工作,该路径可以在任何地方工作,并且比所有realpath文档根目录malarkey都易于阅读。

其他人建议的基于脚本的替代方案的好处是,它们可以在任何地方工作,甚至可以在共享框上使用。设置包含路径需要更多的思考和精力,但是正如我提到的,我们可以开始使用__autoload,它是最酷的。

回答

与凯文(Kevin)相关的另一种选择是使用__FILE__,而是从其中替换php文件名:

<?php

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');

?>

我已经使用了一段时间了。唯一的问题是有时我们没有$ _SERVER ['SCRIPT_NAME']`,但有时还有另一个类似的变量。

回答

解决此问题的另一种方法是根本不需要包含任何内容,那就是使用自动加载功能。包括脚本需要的所有内容"以防万一"可能会妨碍性能。如果我们包含所有类或者接口定义,并且只想在需要时加载它们,则可以使用自己的代码重载__autoload()函数,以找到合适的类文件并仅在调用它时加载它。这是手册中的示例:

function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2();

只要我们相应地设置了include_path变量,就无需再包含类文件。