考虑这个项目结构:
/path/to/projectroot/index.php
头文件.php
包括/inc.php
如果 index.php 有
include('include/inc.php');
和inc.php有
include('header.php');
你会得到那个错误,因为 inc.php 中的行会寻找
/path/to/projectroot/include/header.php(不存在)
不是
/path/to/projectroot/header.php(确实存在)
人们有几种方法可以解决这个问题。
1:绝对路径
第一个也是最直接的方法是使用绝对路径。
如果 index.php 有
include('include/inc.php');
和inc.php有
include('/path/to/projectroot/header.php');
这会奏效。
2:带定义的绝对路径
类似于#1,如果 index.php 有
define('PROJECT_ROOT', '/path/to/projectroot/');
include(PROJECT_ROOT.'include/inc.php');
和inc.php有
include(PROJECT_ROOT.'header.php');
这会奏效。
更新:如pichan评论中所述,您可以在 index.php 中使用“神奇”常量之一,因此:
索引.php
define('PROJECT_ROOT', __DIR__.'/');
include(PROJECT_ROOT.'include/inc.php');
和inc.php
include(PROJECT_ROOT.'header.php');
请注意,我们在此处添加了一个斜杠,__DIR__
因为:
此目录名称没有尾部斜杠,除非它是根目录。
3:同时包含并隐藏错误
如果 inc.php 有
@include('header.php'); # Try this directory
@include('../header.php'); # Try parent directory
这会奏效。 [1]
4:除非另有说明,否则假定当前目录
如果 index.php 有
$rel_prefix_to_root = '../';
include('include/inc.php');
和inc.php有
if(!isset($rel_path_to_root)){ $rel_path_to_root = ''; }
include($rel_path_to_root . 'header.php');
这会奏效。
我对这些方法的看法
1 和 2 基本相同,但是 2 对于大型项目来说更容易和更常见,因为它允许您进行一个常量定义并在站点范围内使用它。它还允许您将项目部署在多个服务器上(放置在多个路径中),并且只需要在项目范围内更改一行,而不是选项 1 的每个文件中的一行。
3 太可怕了,别这样。有时您会看到它,您甚至可能会在在线教程中看到它。不要这样做。
可能应该避免使用 4 来支持 1 或 2。但是如果您有一些复杂的包含集,则这种方法可能是必要的。
一些注意事项:
[1] 这是一个糟糕的主意。它有效,但不要这样做。