php require 找不到,php使用require()时的注意点
目錄層級
各層級代碼如下:
test.php
require("a/a.php");
?>
a.php
require("../b/b.php");
?>
b.php
echo "b";
exit;
?>
aaa.php
echo "aaa";
exit;
?>
首先test.php能夠正確引用到a.php,a.php也能正確引用到b.php,但是訪問test.php時報錯(無法找到b.php):
test報錯
而我們直接訪問a.php是能夠找到b.php的:
image.png
原因其實是因為php require()默認的引用機制不是相對最近一次引用的路徑,而是相對你當前訪問的那個文件的路徑,a.php和b.php都覺得自己引用與被引用沒有問題,但test.php覺得a.php引用b.php的時候出了問題。
于是從test.php的角度看,a.php必須修復(fù)代碼,把require("../b/b.php")改成require("b/b.php"),這樣test就能正常訪問到b了。但是新的問題來了,修改之后直接訪問a是無法正確引用到b的...
這樣的機制稍微一改動就牽扯全身,以下給出兩種解決方案和一點注意事項:
引用的時候統(tǒng)一使用絕對路徑。這樣減少理解成本,且絕不會出錯,缺點是顯得冗余,且不易看出路徑的相對關(guān)系
require的時候使用dirname(__FILE__),具體用法可以自行搜索,最后實現(xiàn)的效果是每個文件都只關(guān)心自己的引用是正確的,即test只管能正常引用a,a只管正常引用b,那么test就能正常引用b。不過個人不是很推薦這種做法,之后解釋原因
注意點:其實引用的這個坑只在內(nèi)層的引用文件往外層去引用會發(fā)生(如上面測試的test.php引用了a.php,而a.php卻往上一層的b文件夾里去引用b.php,導(dǎo)致test和b的相對路徑混亂,test.php找不到b.php從而報錯),但是當我們把a.php里的引用改成require("aaa/aaa.php"),此時理論上test.php應(yīng)該也是找不到aaa.php的,因為aaa.php對test.php的相對路徑應(yīng)該是a/aaa/aaa.php才對,but奇怪的是并沒有出現(xiàn)之前的報錯,即這里的問題只會發(fā)生在內(nèi)層往外引用時,當所有引用都是一層層往里時,是沒有問題的(改成require("a/aaa/aaa.php")之后test.php依舊可以找到aaa.php,但是a.php會找不到aaa.php的)
對于這種引用機制可以這么理解:php作為一個腳本語言,其require的引用原理就是簡單的文本拷貝替換,所以最初test.php的第一行代碼require("a/a.php")直接被替換成了a.php的全部內(nèi)容,即require("../b/b.php"),而test.php根據(jù)這樣的相對路徑找不到b.php,因此報錯(假設(shè)找到了,同理則把這行require再替換成b.php的全部內(nèi)容)。
但是這樣好像依舊解釋不了一層層往里面引用時不會報錯的情況。對這種情況有合理解釋的歡迎指教。
總結(jié)
以上是生活随笔為你收集整理的php require 找不到,php使用require()时的注意点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何理解汽车续航里程?
- 下一篇: 排气加装尾喉违法吗?