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

Xen*_*Yan 92 php

我有一个像下面这样的目录结构;

script.php的

inc/include1.php
inc/include2.php

对象/ object1.php
对象/ object2.php

SOAP/soap.php

现在,我使用这些对象均script.php/soap/soap.php,我可以移动它们,但我想对于一个具体的理由类似的目录结构.当执行script.php包含路径inc/include.php时,执行/soap/soap.php它时../inc,绝对路径有效,/mnt/webdev/[project name]/inc/include1.php...但如果我想将目录移动到其他位置,这是一个丑陋的解决方案.

那么有没有办法使用相对路径,或者一种方式来编程生成"/mnt/webdev/[project name]/"

Pet*_*ton 147

这应该工作

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

include "$root/inc/include1.php";
Run Code Online (Sandbox Code Playgroud)

编辑:通过aussieviking增加了改进

  • 请注意,这仅在您通过填充“DOCUMENT_ROOT”的 Web 服务器执行脚本时才有效 (2认同)

Kev*_*vin 43

您可以使用相对路径.试试__FILE__.这是一个PHP常量,它总是返回它所在脚本的路径/文件名.所以soap.php,你可以这样做:

include dirname(__FILE__).'/../inc/include.php';
Run Code Online (Sandbox Code Playgroud)

文件的完整路径和文件名.如果在include中使用,则返回包含文件的名称.从PHP 4.0.2开始,__FILE__始终包含已解析符号链接的绝对路径,而在旧版本中,它在某些情况下包含相对路径. (资源)

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

  • 请注意,从PHP 5.3.0开始,您可以使用魔术常量`__DIR__`而不必使用`dirname(__ FILE __)`.[(PHP docs)](http://www.php.net/manual/en/language.constants.predefined.php) (9认同)
  • 我认为你应该在引用的表达式的开头添加一个`/`,以将`..`与__FILE__名称分开. (8认同)
  • `include dirname(__ FILE __).'/ ../inc/include.php';`不要忘记相对路径前面的"/". (3认同)

Chr*_*lid 6

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

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


Rya*_*Fox 5

您可以使用项目根目录的路径定义常量,然后将其放在路径的开头.


Sam*_*fee 5

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

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

$obj  = new MyClass1();
$obj2 = new MyClass2(); 
Run Code Online (Sandbox Code Playgroud)

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