首頁  >  文章  >  後端開發  >  PHP 關於require()檔案所包含的用法詳解

PHP 關於require()檔案所包含的用法詳解

黄舟
黄舟原創
2017-06-25 10:28:212397瀏覽

以前看一些PHP框架原始碼的時候,很奇怪在檔案包含的時候,會用dirname(FILE)來拼湊檔案路徑,不知道這樣做有什麼好處,後來終於發現了其中的緣由。

我們來看一個簡單的例子:

有a,b,c三個php檔。 a.php在網站根目錄,b.php在b資料夾下-b/b.php,c.php在 c資料夾下-c/c.php。有些混亂?看圖就一目了然了:

PHP 關於require()檔案所包含的用法詳解

a.php 和b.php 都包含了c.php,最後c.php 包含了d資料夾下的一個php檔— —d/d.php。

我們先來看a.php:

<?php 
    
    $file_name = &#39;a.php&#39;;
    
    echo "this is a.php";
    echo "<hr>";
    
    require(&#39;c/c.php&#39;);
    
 ?>

很簡單的程式碼,列印輸出後,包含了c/c.php,接著,我們要看c/c.php:

<?php 
    $c_file_name = &#39;c.php&#39;;
    
    echo &#39;this is c.php, is required by &#39; . $file_name;
    echo "<hr>";
    
    require(&#39;../d/d.php&#39;);
 ?>

列印輸出"this is c.php, is required by a.php",$file_name是在a.php定義的變數。在最後,包含了d.php。因為d資料夾在目前c.php檔案的上一層,所以,按照常理,我們會理所當 然的把路徑寫成 "../d/d.php"。但是很遺憾,會報錯。原因在於,在被包含的文件中如c.php,再去包含其他文件,路徑是相對於最外層的父文件來說的,也就是相對於a.php,可以理解為因為你被我包含了,所以你要以我為準。看起來很玄乎,原理其實很簡單:你可以把require ('c/c.php'); 看成是c/c.php檔裡的程式碼,這樣我們的a.php看起來可以是這個樣子:

<?php 
    $file_name = &#39;a.php&#39;;
    
    echo "this is a.php";
    echo "<hr>";
    
    // require(&#39;c/c.php&#39;);
    $c_file_name = &#39;c.php&#39;;
    
    echo &#39;this is c.php, is required by &#39; . $file_name;
    echo "<hr>";
    
    require(&#39;../d/d.php&#39;);
 ?>

到此,你可以看到,我們要包含d/d.php檔案時,剛才的路徑是不是錯誤的了?因為,現在是在 a.php的程式碼裡,我們是相對於a.php檔案來說的,當然,路徑應該是 require('d/d.php'); 才對了。 我們修改程式碼如下:

<?php 
    $file_name = &#39;a.php&#39;;
    
    echo "this is a.php";
    echo "<hr>";
    
    // require(&#39;c/c.php&#39;);
    $c_file_name = &#39;c.php&#39;;
    
    echo &#39;this is c.php, is required by &#39; . $file_name;
    echo "<hr>";
    
    require(&#39;d/d.php&#39;);
 ?>

此時,你還沒領悟到深意,需要往下看,我們再看b/b.php:

<?php 
    $file_name = &#39;b.php&#39;;
    
    echo "this is b.php";
    echo "<hr>";
        
    require(&#39;../c/c.php&#39;);
 ?>

不需要解釋了吧,沒啥問題,但是當你把require('../c/c.php'); 換成c/c.php 裡面的程式碼的時候,你會發現問題了,注意,我們剛才修改了c/c .php裡的程式碼,把require('../d/d.php'); 改成了require('d/d.php'); 看下麵包含進來後的程式碼:

<?php 
    $file_name = &#39;b.php&#39;;
    
    echo "this is b.php";
    echo "<hr>";
        
    // require(&#39;../c/c.php&#39;);
    $c_file_name = &#39;c.php&#39;;
    
    echo &#39;this is c.php, is required by &#39; . $file_name;
    echo "<hr>";
    
    require(&#39;d/d.php&#39;);
 ?>

那麼,相對於b/b.php 來說,require('d/d.php'); 的路徑錯了,應該是require ('../d/d.php'); 才對。你回去修改c/c.php 中的require路徑,但不對呀,你改了之後,b/b.php 可以正常運作了,但是a/a.php 又不行了,是不是,它們共用c/c .php ,牽一發動全身,怎麼辦呢。

這時候,我們回到文章開頭提到的 dirname(FILE),這可是個好東西,可以完全解決以上問 題。用了它,就可以不用關心包含你的檔案是哪個檔案、在哪個路徑下面了,不需要顧慮父檔案所在的 層級,因為,dirname(FILE)可以相對於目前檔案指定路徑。也就是說,我們需要將我們的c/c.php 中的require 路徑換成:

<?php 
    $c_file_name = &#39;c.php&#39;;
    
    echo &#39;this is c.php, is required by &#39; . $file_name;
    echo "<hr>";
    
    require(dirname(FILE) . &#39;/../d/d.php&#39;);
 ?>

這裡,我們只需要把c/c.php 作為參照,相對於它來說,d/ d.php 在上一層。這樣,就只有一個標 準了,那就是,以我為準,管你包含我,還是他包含我,我只以我自己為準,我要包含的文件只相對於 我自己而言了。

對於 dirname(FILE) 不明白的同修,請google,很簡單。

以上是PHP 關於require()檔案所包含的用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn