PART1.绝对路径与相对路径实例
网站目录有以下两个文件:
D:\WWW\PHP\A.php
D:\WWW\PHP\B.php
绝对路径演示:
A.php代码如下:
<?php
echo 'Hello 我是A!'
?>
B.php代码如下:
<!DOCTYPE html>
<?php
require ('D:\www\\php\a.php');
?>
这时打开B.PHP会显示”Hello 我是A!”,如下图:

在这个实例里,B的require就使用了绝对路径.
但一般我们不这样使用,因为当环境变化(比如换台电脑或重装系统改了WWW的位置)后,B的代码就失效了.
相对路径演示:
增加一个主页文件
D:\WWW\index.php
Index.php代码为:
<?php
echo '我是主页!';
?>
B.php代码如下:
<!DOCTYPE html>
<?php
require ('.\a.php');
echo “<br>”;
require ('..\index.php');
?>
这时打开B.PHP显示如下图:

在这个实例里,B的require使用了相对路径.
.\表示当前目录
..\表示上级目录
这样不管网站的路径环境如何改变,代码始终有效.
PART2.二次require的相对路径问题:
网站目录有以下几个文件:
D:\WWW\PHP\A.php
D:\WWW\PHP\B.php
D:\WWW\PHP\A.php
D:\WWW\PHP\A.php的代码如下:
<?php
echo 'Hello 我是A!'
?>
D:\WWW\PHP\B.php的代码如下:
<!DOCTYPE html>
<?PHP
require ('.\a.php');
?>
D:\WWW\A.php的代码如下:
<?php
echo 'Hello 我是假A!'
?>
再增加三个文件,目标都指向B.PHP
D:\WWW\1.php
代码如下:
<?php
require ('.\php\b.php');
?>
D:\WWW2\2.php
代码如下:
<?php
require ('..\www\php\b.php');
?>
D:\WWW\php\3.php
代码如下:
<?php
require ('.\b.php');
?>
这时打开1.PHP会出现”Hello 我是假A!”的页面.
打开2.PHP都会出现下面错误提示.
Fatal error: require(): Failed opening required '.\a.php'
只有3.php是正常的显示”Hello 我是A!”.
这是因为二次require后,B.PHP使用的相对路径对其它文件来说不一定有效,所以才出现以上三种情况 .
如何解决呢?把B.PHP的路径改为绝对路径(D:\www\php\a.php)就好了.但我们前面已经说了,绝对路径并不适合复杂环境,还能怎么办?
PHP5.3之后的版本给我们提供一个魔术常量,它就是:__DIR__
__DIR__:指向当前执行的PHP脚本所在的目录.
因此,我们只需要把B.PHP的代码改为:
<!DOCTYPE html>
<?PHP
require __DIR__ .('.\a.php');
?>
所有的问题都解决了.
PART3.跨目录require的相对路径问题
问题难度再升级一下,把A.PHP的路径改为:
D:\WWW2\A.php
其它文件路径不变.依然是:
D:\WWW\PHP\B.php
D:\WWW\1.php
D:\WWW2\2.php
D:\WWW\php\3.php
如果不改代码,以上四个文件都是无法正常显示的.
把B.PHP的代码改为
<!DOCTYPE html>
<?PHP
require ('..\..\www2\a.php');
?>
之后B.PHP和3.PHP可正常显示”Hello 我是A!”.
可是2.php和3.php还是报错.
在不使用绝对路径的情况下,且魔术常量__DIR__已经不起作用,只有全局变量”$_SERVER['DOCUMENT_ROOT']”能拯救一切.
$_SERVER['DOCUMENT_ROOT']:当前运行脚本所在的文档根目录
把B.PHP的代码改为
<!DOCTYPE html>
<?PHP
Require $_SERVER['DOCUMENT_ROOT']. ('.\www2\a.php');
?>
问题都解决.
注意事项:
1.本文的编程环境为:windows10操作系统/PHP7.3软件/Atom 编辑器.
2.另一个跟路径有关的魔术常量为__FILE__:文件的完整路径和文件名