相对路径,相对的是工作目录(working directory),也就是当前命令行所处的目录(pwd查看);
目录结构:
D:\dev\php\magook\trunk\server\testdir
a.php
t/
b.php
c.txt
测试
a.php
echo file_get_contents("t/c.txt");
D:\dev\php\magook\trunk\server\testdir>php a.php
aaaaaaaaaaaaaaa
D:\dev\php\magook\trunk\server\testdir>cd ../
D:\dev\php\magook\trunk\server>php testdir/a.php
PHP Warning: file_get_contents(t/c.txt): failed to open stream: No such file or directory in D:\dev\php\magook\trunk\server\testdir\a.php on line 12
Warning: file_get_contents(t/c.txt): failed to open stream: No such file or directory in D:\dev\php\magook\trunk\server\testdir\a.php on line 12
如果改成绝对路径
a.php
echo file_get_contents(__DIR__ . "/t/c.txt"); // __DIR__ 获取当前脚本在计算机中的绝对路径
D:\dev\php\magook\trunk\server>php testdir/a.php
aaaaaaaaaaaaaaa
D:\dev\php\magook\trunk\server>cd testdir
D:\dev\php\magook\trunk\server\testdir>php a.php
aaaaaaaaaaaaaaa
可见使用相对路径并不靠谱。
再比如
a.php
require('t/b.php');
echo read();
b.php
function read() {
return file_get_contents("c.txt");
}
D:\dev\php\magook\trunk\server\testdir>php a.php
PHP Warning: file_get_contents(c.txt): failed to open stream: No such file or directory in D:\dev\php\magook\trunk\server\testdir\t\b.php on line 5
Warning: file_get_contents(c.txt): failed to open stream: No such file or directory in D:\dev\php\magook\trunk\server\testdir\t\b.php on line 5
修改后
b.php
function read() {
return file_get_contents("t/c.txt");
}
D:\dev\php\magook\trunk\server\testdir>php a.php
aaaaaaaaaaaaaaa
D:\dev\php\magook\trunk\server\testdir>cd ../
D:\dev\php\magook\trunk\server>php testdir/a.php
PHP Warning: file_get_contents(t/c.txt): failed to open stream: No such file or directory in D:\dev\php\magook\trunk\server\testdir\t\b.php on line 4
Warning: file_get_contents(t/c.txt): failed to open stream: No such file or directory in D:\dev\php\magook\trunk\server\testdir\t\b.php on line 4
b.php
文件如果被多个文件引用那该怎么办?看到这里,发现相对路径更加不靠谱了。
所以改成绝对地址才是一劳永逸的。
最后说一下 require
和include
,它们内部使用的是相对于本脚本的地址,而不是相对于working directory,可以放心使用。
b.php
function read() {
echo "here";
}
D:\dev\php\magook\trunk\server>php testdir/a.php
here
D:\dev\php\magook\trunk\server>cd testdir
D:\dev\php\magook\trunk\server\testdir>php a.php
here
无论在哪里执行都一样。